2017-06-13 6 views
-1

Ich versuche, 10 Steine ​​mit einer LinkedList zu erstellen und sie zufällig auf dem Bildschirm gerendert. Warum funktioniert es nicht? Ich habe versucht, es jetzt für 3 Tage herauszufinden, bitte geben Sie mir die Antwort. Ich würde es wirklich schätzen. Vielen Dank.Warum wird nicht mehr als ein Objekt gerendert?

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

haben Sie das Debuggen implementieren müssen? –

+0

Ihre 'tick'-Funktion ** nur ** ruft den letzten Ziegel Tick, andere ist kein Anruf. verschiebe den 'TempBricks.tick' in die Schleife –

Antwort

2

Sorry, aber diese Methoden keinen Sinn machen:

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 
} 

Sie durchlaufen die Liste, aber nur auf der letzten - verrückt. Warum wirken nicht auf die Elemente innerhalb der for-Schleife ?:

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 
    } 
} 

Auch als Cricket treffend schlägt vor: loszuwerden, die TempBricks Feld wie alle es tut Sie ist verwirrend.

Nebenbei möchten Sie lernen und Java naming conventions verwenden. Variablennamen sollten alle mit einem niedrigeren Buchstaben beginnen, während Klassennamen mit einem Großbuchstaben beginnen. Plus, ein Brick ist ein singuläres Objekt, und die Klasse sollte als solche benannt werden. Wenn wir dies lernen und diesem Beispiel folgen, können wir Ihren Code besser verstehen und den Code anderer besser verstehen.

Ihre Frage weist darauf hin, dass Sie Ihr Programm nicht ordnungsgemäß debuggen, und Sie profitieren sehr davon, wenn Sie den IDE-Debugger verwenden und den Code durchgehen, um zu sehen, was er tut. Debuggen Sie auch auf Papier - gehen Sie logischerweise durch Ihren Code, um zu sehen, ob es sinnvoll ist.

+0

Auch' TempBricks' als Feld sollte komplett entfernt werden –

+0

@ cricket_007: es ist ein triviales Problem und sollte wahrscheinlich geschlossen werden als "Tippfehler/kann nicht reproduzieren" weshalb ich es als Gemeinschaft beantwortet habe Wiki. Aber ich werde das auch hinzufügen. –

0

Sie haben nur eineTempBricks.

public class Controller { 

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

    Bricks TempBricks; // Remove this 

Und als Konsequenz verwenden Sie nur dieses in Ihren Schleifen.

Hier ist eine allgemeine Verknüpfung, die Sie verwenden können. Eine für jede Schleife.

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

Auch für removeBrick richtig arbeiten zu können, equals() und hashcode() in Ihrer Brick Klasse

Verwandte Themen