2017-06-13 6 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 
} 

あなたはリストを反復しますが、最後のものにしか行動しません - 狂っています。なぜ、forループ内の項目に作用していない?:

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:それはささいな問題で、おそらく "typo/can not reproduce"として閉じられるべきなので、私はコミュニティとして答えましたwiki。しかし、私もそれを追加します。 –

0

1つだけ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()あなたがこれをデバッグでした

関連する問題