2016-07-15 4 views
0

ボールをバウンスする方法を説明するいくつかの回答をインターネットで見つけましたが、バウンスがランダムではないためにいくつかのものが助けになりませんでした。 )。ランダムなバウンスボール

問題:私はボールが動いて跳ねますが、無作為ではありません。このボールをランダムにバウンスさせたいと思います。

私はすでにコードのこの部分を持っている:

Public Class Ball{ 

    /** Coordinates */ 
    private int x, y; 

    /** Speed of the ball*/ 
    private int speedX, speedY; 

    public Ball(int x, int y, int speedX, int speedY) { 
     this.x = x ; 
     this.y = y ; 
     this.speedX = speedX; 
     this.speedY = speedY; 
    } 

    public void moveAndBounce() { 
     x += speedX ; 
     y += speedY ; 

     // Assuming that touchWallHorizontal() and touchWallHorizontal() work 
     if (touchHorizontalWall()) { 
      speedX = -speedX ; 
     } 
     if (touchVerticalWall()) { 
      speedY = -speedY ; 
     } 
    } 

    public static void main (String [] args){ 
     Ball ball = new Ball(); // Initialisation 
     while (true){ 
      ball.moveAndBounce() ; 
     } 
    } 
} 

それは完璧に動作しますが、ボールの動きは常に(長方形)と同じです。

質問:ボールに属性を追加することなく(座標とスピードだけで)無作為にバウンスさせる方法はありますか?

もしそうでなければ、この問題を解決するにはあまりにも難しい解決策はありませんか?

ありがとうございます!

+1

あなたがバウンスする必要があるときだけ、ランダムな数字に 'speedX' /' speedY'を設定しないのはなぜ?しかし、それはあなたがいかに速くそれが気にしない場合にのみ働く。一定の速度を確保する必要があるがランダムな方向が必要な場合は、ランダムな角度を生成し、その速度を計算します。 – jonhopkins

+0

私は 'setSpeedX(int)Math.random()* 10)'を実行しようとしました。しかしボールはちょうど消滅し、跳ね返りません。私は、新しいスピードがマップの "内部"にとどまるように制御する必要があるため、乱数は機能しないと思います。しかし、私はアングルで作業しようとします、あなたの答えに感謝します。 –

+1

私は最初のコメントでその問題を述べたはずです。乱数が働くことができます。現在の速度が正の場合は、乱数を負にします。現在の速度が負の場合は、乱数を正にします。ランダムな角度で同じ問題が発生します。別の問題は、壁との衝突を調べる方法によっては、スピードが速すぎるとボールがすぐに通過することです。ボールがボックスの外側にあるかどうかを確認してください。ボールがボックスの外にあるかどうかを確認してください。 – jonhopkins

答えて

1

問題を解決しました。ここでmoveAndBounce()メソッド(johnHopkinsのおかげで)のための新しいコードは次のとおりです。

public void moveAndBounce() { 
    x += speedX ; 
    y += speedY ; 

    Random random = new Random(); 
    if (touchHorizontalWall()) { 
     if (speedX > 0) { 

      // New speed between 10 and 15 (you can choose other) 
      setSpeedX(-random.nextInt(15) + 10); 
     } else { 
      setSpeedX(random.nextInt(15) + 10 
     } 
    } 
    if (touchVerticalWall()) { 
     if (speedY > 0) { 
      setSpeedY(-random.nextInt(15) + 10); 
     } else { 
      setSpeedY(random.nextInt(15) + 10); 
     } 
    } 
} 
関連する問題