0

我正在尝试创建一个简单的动画,使 GOval 球从图形窗口的底部和顶部反弹,一次又一次地向上和向下,直到我退出窗口。问题是我不明白如何让球识别图形窗口的底部并开始以另一种方式反弹。换句话说,球永远不会从地板上反弹,它只是不断下落,最终从屏幕底部消失。
只要i < STEPS,球就应该向下移动,这是思考这个问题的正确方法吗?我不明白球弹起来然后又弹下来的条件应该是什么。

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

public class BouncingBall extends GraphicsWindow{
    public void run(){
        GOval ball = new GOval(0, 0, OVAL_SIZE, OVAL_SIZE);
        ball.setFilled(true);
        add(ball);

        int dx = 0;
        int dy = 1;

        while(true) {
            int i = 0;
            if ( i < STEPS) {
                ball.move(dx, dy);
                pause(PAUSE_TIME);
            } 
            if (??) {
                ball.move(dx, - dy);
                pause(PAUSE_TIME);
            }
            i++;
        }
    }

    private static final STEPS = 1000; 
    private static final OVAL_SIZE = 25; 
    private static final PAUSE_TIME = 7;
}
4

3 回答 3

2

你的意思是GraphicsProgram代替GraphicsWindow吗?

GraphicsPrograms 有一个getHeight()方法可以告诉你你的窗户有多高。所以在这种情况下:

if (ball.getY() + ball.getHeight() >= getHeight()) {
    dy = -dy;
}

这将在球经过屏幕底部时反转球的 y 速度。如果您希望它来回弹跳,您可以为屏幕顶部编写类似的代码。

于 2013-03-26T22:12:42.293 回答
0

这里的基本算法是使用显示区域的大小和对象边界的大小来确定对象何时与显示区域的边缘发生碰撞。发生这种情况时,将速度矢量的适当元素取反。

于 2013-03-26T22:06:52.273 回答
0

您必须将方向存储在布尔值中,如下所示:

  boolean up=true;
  while(true){

  if (up){
  ball.move(dx, dy);
  pause(PAUSE_TIME);
  } 
  else
  {
  ball.move(dx, - dy);
  pause(PAUSE_TIME);
  }
  if(getHeight()<=ball.getHeight+ball.getY()||ball.getHeight()<=ball.getY){
  up=!up;      
  }
  }

现在,如果球到达窗口的尽头,它会改变方向并朝相反的方向移动。

于 2013-03-26T22:17:03.500 回答