0

それで、ボールが描画パネルの周りを 10 秒間バウンドするプログラムを作成することになっています。ボールがパネルに当たった場合、ボールはパネルの側面で跳ね返る必要があります。現在、ボールがバウンドする代わりに下部パネルに当たると、画面の中央に表示され、上部に当たり消えるまで反対方向に移動します。

問題はコードのこの部分にあると確信しています... (コードの前半で、x を 1、y を 250、dx を 1、dy を 1 に宣言しました)

//Changes dirction 
public static int newDirection1(int x, int dx, int size){
  if (x < 0 || x > 500 || (x + size) < 0 || (x + size) > 500)  {
    dx *= -1;
    return dx;
  } else {
    return dx;
  } 
} 

//Changes direction 
public static int newDirection2(int y, int dy, int size){
  if (y < 0 || y > 500 || (y + size) < 0 || (y + size) > 500)  {
    dy *= -1;
    return dy;
  } else {
    return dy;
  } 
 } 

 //Moves ball one step
 public static void move(Graphics g, Color color, int size, int x1, int y1, int x2, int y2){

   g.setColor(Color.WHITE);
   g.fillOval(x1, y1, size, size);
   g.setColor(color);
   g.fillOval(x2, y2, size, size);


 } 

 //Pauses for 10ms
 public static void sleep(int millis, DrawingPanel panel){
   panel.sleep(millis);
 } 


public static void bounceLoop(DrawingPanel panel, Graphics g, Color color, int size, int x, int dx, int y, int dy, int millis){

   int x1 = x + dx;
   int x2 = x + dx;
   int y1 = y + dy;
   int y2 = y + dy;

   for (int i = 0; i < 1000; i++) {

     x1 = x + dx * i;
     x2 = (x + dx * i) + dx;
     y1 = y + dy * i;
     y2 = (y + dy * i) + dy;
     dx = newDirection1(x2, dx, size);
     dy = newDirection2(y2, dy, size); 
     move(g, c, size, x1, y1, x2, y2);
     sleep(millis, panel);

   } 
  } 

} 
4

1 に答える 1

1

ループでは使用しないでください:

x1 = x + dx * i  

使用する

x1 = x1 + dx 

(y についても同じ)
dx が変更され、-1 を掛けるたびに、元の場所から続行するのではなく、反対方向に移動するため、パネルの反対側、またはそのポイントから続行するためです。本当にオフです。

また、コーディングを修正できる可能性のあるいくつかのこと:
1- getNewDirection に dx パラメータは必要ありません。必要なのは座標だけです。
2-境界条件によってエラーが発生する場合があります。作成されたパネルの外側または使用しているものの外側にオブジェクトを作成する際のエラーを回避するために、肉眼では見えない小さなオフセットを与えてください。

于 2013-10-17T16:57:42.987 に答える