我正在尝试使用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 :(得分: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类中实现removeBrick
和equals()