我正在尝试创建一个简单的动画,将GOval球从图形窗口的底部和顶部反弹,一次又一次地上下移动,直到我退出窗口。问题是我不明白如何让球识别图形窗口的底部并开始以其他方式反弹。换句话说,球永远不会从地板上反弹,只会不断下降并最终从屏幕底部消失。左,只要我<这是解决这个问题的正确方法。球应该向下移动的步骤。我不明白球应该反弹,然后再次下降的条件。
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;
}
答案 0 :(得分:2)
您的意思是GraphicsProgram
而不是GraphicsWindow
吗?
GraphicsProgram
有一个getHeight()
方法可以告诉你窗户的高度。所以在这种情况下:
if (ball.getY() + ball.getHeight() >= getHeight()) {
dy = -dy;
}
当球越过屏幕底部时,这将反转球的y速度。如果您希望它来回反弹,您可以在屏幕顶部编写类似的代码。
答案 1 :(得分:0)
这里的基本算法是使用显示区域的大小和对象边界的大小来确定对象何时与显示区域的边缘碰撞。发生这种情况时,否定速度矢量的适当元素。
答案 2 :(得分: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;
}
}
现在,如果球到达窗户的末端,它会改变方向并向相反的方向移动。