为什么它不能渲染多个相同的对象?

时间:2017-06-13 01:43:55

标签: java

我正在尝试使用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);
}

}

2 个答案:

答案 0 :(得分: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的调试程序并逐步执行代码,看看它正在做什么,您将受益匪浅。还可以在纸上调试 - 逻辑地浏览代码以查看它是否有意义。

答案 1 :(得分:0)

您只有一个 func distanceFrom<T: Strideable, U>(_ a: T, to b: T) -> U where T.Stride == U { return a.distance(to: b) } let doubleFoo: Double = 4.5 let intFoo: Double = 4 let g = distanceFrom(doubleFoo, to: intFoo) // gives me a double of -0.5

TempBricks

因此,您只在循环中使用那个。

这是您可以使用的常用快捷方式。一个for-each循环。

public class Controller {

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

    Bricks TempBricks; // Remove this

此外,要使public void render(Graphics g) { // renders **every** brick for (Brick brick : b) { brick.render(g); } } 正常工作,您必须在您的Brick类中实现removeBrickequals()