2017-06-13 75 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()