Java弹跳球墙

时间:2014-01-30 12:14:26

标签: java

我正在尝试理解这些代码:

    /*
 * File: BouncingBallWalls.java
 * ---------------------
 * This is exercise 15 in chapter 4 of "The Art and Science of Java."
 * It requires me to write a program that makes an animated bouncing
 * ball on the screen, bouncing off the window edges.
 */

import java.awt.*;
import acm.program.*;
import acm.graphics.*;

public class BouncingBallWalls extends GraphicsProgram {
    public void run() {
        GOval ball = new GOval (getWidth()/2 - BALL_SIZE/2, getHeight()/2 - BALL_SIZE, BALL_SIZE, BALL_SIZE);               /* Centers the ball */
        ball.setFilled(true);
        ball.setFillColor(Color.BLUE);
        ball.setColor(Color.BLUE);
        add(ball);
        double dx = (getWidth()/N_STEPS);
        double dy = (getWidth()/N_STEPS);
        while(true) {
            ball.move(dx, dy);                                   /* Movement for the ball */
            pause(PAUSE_TIME);
            if (ball.getY() > getHeight() - BALL_SIZE) {         /* Each "if" statement reverses the direction of the ball on one */
                dy = dy * -1;                                                         /* axis if it hits a boundry */
            }
            if(ball.getX() > getWidth()- BALL_SIZE) {
                dx = dx * -1;
            }
            if(ball.getY() < 0) {
                dy = dy * -1;
            }
            if(ball.getX() < 0) {
                dx = dx * -1;
            }
        }
    }
    private static final double N_STEPS = 1000;
    private static final double PAUSE_TIME = 2;
    private static final double BALL_SIZE = 50.0;
}

我理解除了以下内容之外的所有内容,为什么要将 gameWidth 除以 N_STEPS ?什么是 N_STEPS

        double dx = (getWidth()/N_STEPS);
        double dy = (getWidth()/N_STEPS);

private static final double N_STEPS = 1000;

参考:http://tenasclu.blogspot.co.uk/2012/12/first-few-days-of-learning-to-program.html

3 个答案:

答案 0 :(得分:1)

您将屏幕尺寸除以N_STEPS以获得dx和dy,它们表示您希望球在每个循环中移动的距离。 N_STEPS根据可用的屏幕宽度定义移动,以便无论屏幕大小如何,相对移动/速度都相同。

另一种观察N_STEPS的方法是控制球的平滑度和速度。无论屏幕大小如何,它都能使平滑度和速度保持一致。较高的N_STEPS将导致每个循环的球移动更平滑/更慢。

请注意您的代码:

double dx = (getWidth()/N_STEPS);
double dy = (getWidth()/N_STEPS);

应该:

double dx = (getWidth()/N_STEPS);
double dy = (getHeight()/N_STEPS);

答案 1 :(得分:0)

基本上,课程所展示的是动画球的运动。现在在while循环的每次迭代中,球必须在x中移动一定距离并在y中移动一定距离。这种增量变化表示为dx和dy。

要计算球在每个增量中应移动多少,球应移动的总距离除以迭代次数。这是为了营造平稳运动的感觉。如果步数太低而且行进所需的总距离太高,则球会从一个点跳到下一个点。

答案 2 :(得分:0)

N-STEPS是屏幕上的像素/单位距离。不同的设备有不同的尺寸。假设您的设备宽度为800像素。无论设备大小如何,您都可能想要制作一个虚构的网格。假设我们将大小除以20,我们得到40(800/20 = 40)。这给了我们40个像素或1个单位。因此,如果我们移动某些东西,我们可以水平移动40个像素或1个单位。这有助于处理不同的屏幕尺寸。