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か?

GraphicsProgramgetHeight()ウィンドウの高さを示すメソッドがあります。したがって、この場合:

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 に答える