我最近开始学习Java,所以这是一个初学者的问题。 我有以下简单的代码,我过去一小时调试没有成功。我觉得这触及了一个我不完全掌握的实例变量的基本概念。
我的程序创建一个在屏幕上移动的GOval对象。实例变量用于指定球的大小和起始速度/方向(定义为随机x / y坐标)。 run()
程序中的while循环使球保持移动。
我的程序的目标是让移动的球保持在窗口内,只要它碰到图形窗口的任何一个墙壁,它就会反向移动。如果反转球方向的if语句写在里面 run()
方法,我可以让球从墙上弹开是没有问题的。但是,如果我在单独的方法CheckWall()
中使用相同的代码,则球不会按预期反弹,只是移出屏幕。
有人可以帮我理解为什么子方法没有按预期工作?我在这种情况下使用实例变量是否正确?
请注意,在下面的代码中,我使用“//”来注释run方法中正常工作的if语句。这些相同的方法已经复制/粘贴到我的CheckWall方法中。
public class S7_DebuggingExample extends GraphicsProgram {
private RandomGenerator rgen = new RandomGenerator();
private static final int BALL_RADIUS = 20;
private static final double MIN_DX = 2.0;
private static final double MAX_DX = 3.0;
private static final double MIN_DY = 2.0;
private static final double MAX_DY = 3.0;
private static final double PAUSE = 15.0;
private GOval ball;
private double dx;
private double dy;
public void run() {
double dx = rgen.nextDouble(MIN_DX, MAX_DX);
double dy = rgen.nextDouble(MIN_DY, MAX_DY);
SetupBall();
while (true) {
ball.move(dx, dy);
// if (ball.getX() <= 0 || ball.getX() >= getWidth() - (BALL_RADIUS * 2)) dx = -dx;
// if (ball.getY() <= 0 || ball.getY() >= getHeight() - (BALL_RADIUS * 2)) dy = -dy;
CheckWall();
pause(PAUSE);
}
}
private void CheckWall() {
if (ball.getX() <= 0 || ball.getX() >= getWidth() - (BALL_RADIUS * 2)) dx = -dx;
if (ball.getY() <= 0 || ball.getY() >= getHeight() - (BALL_RADIUS * 2)) dy = -dy;
}
private void SetupBall() {
ball = new GOval(BALL_RADIUS * 2, BALL_RADIUS * 2);
ball.setFilled(true);
ball.setColor(Color.RED);
double x = rgen.nextDouble(0, getWidth() - (BALL_RADIUS * 2));
double y = rgen.nextDouble(0, getHeight() - (BALL_RADIUS * 2));
ball.setLocation(x, y);
add(ball);
}
答案 0 :(得分:0)
您有两个名为dx的变量。该函数更新类成员变量,但run方法使用方法中定义的局部变量。
答案 1 :(得分:0)
您的班级中声明了两个变量dx和dy。 以下是全局的,除非找到具有相同名称和类型的局部变量,否则所有方法都会访问它们。在类变量上选择局部变量。
private double dx;
private double dy;
所以在你的方法run()之外,你在run()中使用的dx和dy变得无效,而是使用了类级变量。
答案 2 :(得分:0)
Checkwall()使用类中声明的dx和dy变量,而run方法使用run()中定义的 local 变量。因此问题。只需注释掉本地定义的运行变量,并在SetUpBall()方法中初始化类成员 dx和dy。