Submethod未按预期更新本地实例变量

时间:2013-12-27 03:13:37

标签: java

我最近开始学习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);
}

3 个答案:

答案 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。