2017-06-13 77 views
-1

我正在尝试使用LinkedList创建10个砖,并将它们随机呈现在屏幕上。为什么它不工作?我一直试图弄清楚3天,请给我答案。我真的很感激它。谢谢。为什么它不能渲染多个同一个对象?

Game.java

public class Game{ 
    private Controller c; 

    public void init(){ 
    c = new Controller(this); 
    } 

    public void run(){ 
    init(); 
    //gameLoop 
    } 

    public void tick(){ 
    c.tick(); 
    } 

    public void render(){ 
    c.render(g); 
    } 



} 

Bricks.java

public class Bricks { 

private double x, y; 

Game game; 
private Image BrickImg; 


public Bricks(double x, double y, Game game) { 
    this.x = x; 
    this.y = y; 
    this.game = game; 

    ImageIcon bricksImg = new ImageIcon("res\\bricks.png"); 
    BrickImg = bricksImg.getImage(); 
} 

public void tick() { 

} 

public void render(Graphics g) { 
    g.drawImage(BrickImg, (int)x, (int)y, null); 
} 

} 

Controller.java

public class Controller { 


Game game; 

private LinkedList<Bricks> b = new LinkedList<Bricks>(); 

Bricks TempBricks; 
Random random = new Random(); 

public Controller(Game game) { 
    this.game = game; 

    for (int i = 0; i < 10; i++) { 
     addBrick(new Bricks(random.nextInt(500), 50, game)); 
    } 
} 

public void tick() { 
    for (int i = 0; i < b.size(); i++) { 
     TempBricks = b.get(i); 
    } 

    TempBricks.tick(); 
} 

public void render(Graphics g) { 
    for (int i = 0; i < b.size(); i++) { 
     TempBricks = b.get(i); 
    } 

    TempBricks.render(g); 
} 

public void addBrick(Bricks brick) { 
    b.add(brick); 
} 

public void removeBrick(Bricks brick) { 
    b.remove(brick); 
} 

} 
+0

你调试这个? –

+0

您的'tick'功能只**调用最后一个砖块的勾号,其他砖块不勾选。移动'TempBricks.tick'进入循环 –

回答

2

很抱歉,但这些方法并没有什么意义:

public void tick() { 
    for (int i = 0; i < b.size(); i++) { 
     TempBricks = b.get(i); 
    } 

    TempBricks.tick(); // ticks the **last** brick in the list 
} 

public void render(Graphics g) { 
    for (int i = 0; i < b.size(); i++) { 
     TempBricks = b.get(i); 
    } 

    TempBricks.render(g); // renders only the **last** brick in the list 
} 

您遍历列表,但仅对最后一个行动 - 疯狂。为什么不作用于内的物品的循环?:

public void tick() { 
    for (int i = 0; i < b.size(); i++) { 
     b.get(i).tick(); // ticks **every** brick 
    } 
} 

public void render(Graphics g) { 
    for (int i = 0; i < b.size(); i++) { 
     b.get(i).render; // renders **every** brick 
    } 
} 

而且板球恰如其分地表明:摆脱TempBricks场的所有它做的是迷惑你。

顺便说一句,你将要学习和使用Java naming conventions。变量名应该全部以小写字母开头,而类名则以大写字母开头。另外,一个Brick是一个单一的对象,并且该类应该这样命名。了解这一点,并遵循这一点将使我们能够更好地理解您的代码,并让您更好地理解其他代码。

你的问题建议你没有正确调试程序时,你会被使用IDE的调试器和单步调试代码,看到它在做什么受益匪浅。也可以在纸上进行调试 - 从逻辑上浏览代码,看看它是否有意义。

+0

也'TempBricks'作为现场应全部取消 –

+0

@ cricket_007:这是一个很重要的问题,而且也应该封闭,“错字/无法重现”,这就是为什么我回答像一个社区维基。但我还会补充一点。 –

0

您只有一个TempBricks

public class Controller { 

    Game game; 
    private LinkedList<Bricks> b = new LinkedList<Bricks>(); 

    Bricks TempBricks; // Remove this 

因此,你只能在你的循环中使用那个。

这里你可以使用一般的快捷方式。一个for-each循环。

public void render(Graphics g) { 
    // renders **every** brick 
    for (Brick brick : b) { 
     brick.render(g); 
    } 
} 

而且,removeBrick正常工作,你必须实现在砖类equals()hashcode()