2016-07-15 108 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); 
     } 
    } 
}