Java/ACM : Why doesn't my object move?

标签 java breakout acm-java-libraries

我目前正在阅读 Eric Robert 的Java 艺术与科学,其中使用了 ACM Java 库。其中一项练习要求学生构建 Breakout 的克隆版本。我对对象的动画有疑问,所以请看一下这段代码,如果可能的话请告诉我为什么球不移动。

这是我编写的代码示例,用于隔离给我带来麻烦的行为,但在花了整个晚上之后,我认为我最好寻求帮助,因为我根本没有取得任何进展。代码应该实现的只是移动对象。 (注意:这不是家庭作业问题。)

我在 setup() 中设置了带有球的 Canvas ,并打算在 play() 中让球移动,但没有任何反应。

代码也已粘贴到:http://pastebin.com/vy3rMrZw

   package codeSamples_II;

import acm.program.*;
import acm.graphics.*;


public class PlayBall extends GraphicsProgram {

private static final int DELAY = 50;
private GOval ball;
private static final int BALL_RADIUS = 10;

public void run() {
    setup();
    play();
}

private void setup() {
    GOval ball = new GOval(0,0, BALL_RADIUS*2, BALL_RADIUS*2);
    ball.setFilled(true);
    add(ball);
}

public void play() {
    while (ball.getY() < 200) {
        ball.move(5, 5);
        pause(DELAY);
    }
}

}

非常感谢!

最佳答案

哦,呃!我不敢相信我不是第一次看到这个......

这就是正在发生的事情。

当你的 PlayBall 类实例化时,你的定义 私有(private)GOval球。这将创建一个指向 GOval 对象的空指针(没有值的变量)。

setup()中,您创建一个名为ballGOval变量。 这个与您在全局范围内创建的那个不同。这个名为 ball 的新变量是 局部变量,仅存在于 setup() 方法中。它与全局相同 变量。因此,在 play() 中,当您尝试移动 ball 时,您正在尝试移动全局 变量 ball与您在 setup() 中创建的局部变量不同。实际上, 全局变量 ball 从未被实例化(从未创建,或为 null),所以你实际上不能 对其进行操作。这就是您收到空指针错误的原因。

要修复代码,您需要确保将全局变量分配给新球, 不是局部变量。修复起来很容易,您只需删除 GOval 标识符即可 在 ball = new Goval( ... ) 之前。您的代码将如下所示:

package codeSamples_II;

import acm.program.*;
import acm.graphics.*;


public class PlayBall extends GraphicsProgram {

private static final int DELAY = 50;
private GOval ball;
private static final int BALL_RADIUS = 10;

public void run() {
    setup();
    play();
}

private void setup() {
    ball = new GOval(0,0, BALL_RADIUS*2, BALL_RADIUS*2);
    ball.setFilled(true);
    add(ball);
}

public void play() {
    while (ball.getY() < 200) {
        ball.move(5, 5);
        pause(DELAY);
    }
}
}

如果您仍然不明白,您可能需要阅读变量作用域以更好地了解正在发生的事情。

关于Java/ACM : Why doesn't my object move?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11638503/

相关文章:

Java:突破游戏,滑动时移动玩家?

c++ - 我应该如何将对象传递给类以检查碰撞?

java - 在 acm.program.GraphicsProgram 中找不到符号方法 addMouseListeners()

java - 如何解决 AEM6.1 中的 "org.apache.sling.servlets.post.impl.operations.ModifyOperation Unable to create resource"错误?

java - 构造函数中的 Spring 非必需属性?

Javascript 将 <canvas> 设置为窗口大小

java - 'd' 代表什么 in - move(double dx, double dy)?

java - 对话框中的 println 带有非拉丁符号

java - 在 Java 中的 App Engine 上复制 blobstore 实体的最佳方法是什么?

java - 使用 for(boolean haveNext = false;;) 而不是 while(cond)