2015-04-04 130 views
0

我寫一個程序,允許用戶左鍵單擊面板,並添加一個反彈球,並用鼠標右鍵單擊要刪除一個球。球以不變的速度從所有的牆壁彈出。我完成了所有這些。我想不出的最後一部分是處理與其他彈跳球的碰撞。應該發生與從牆壁反彈相同的結果。任何幫助將不勝感激。下面是球至今的移動代碼...彈跳球的碰撞

@SuppressWarnings("AccessingNonPublicFieldOfAnotherObject") 
private void processMovement(long interval) 
{  
    /* Compute the distance moved in the interval. Decompose the distance 
moved into x and y components, and determine the next position of the Ball 
by those amounts. */ 

    float x = position.x + velocity.getDistanceX(interval); 
    float y = position.y + velocity.getDistanceY(interval); 
    position.setLocation(x, y); 

    /* Collisions with the walls. If so, adjust the speed and direction for 
     the next period. */ 

    /* Collision with the east or west (vertical) wall. */ 
    float wall; 
    if(x <= (wall = 0.0F) || 
      x >= (wall = model.getDimension().width - SIZE)) 
    { 
     x = wall; 
     velocity.reverseX(); 
    } 

    /* Collision with the north or south (horizontal) wall. */ 
    if(y <= (wall = 0.0F) || 
      y >= (wall = model.getDimension().height - SIZE)) 
    { 
     y = wall; 
     velocity.reverseY(); 
    } 
    position.setLocation(x, y); 
} 
+1

你嘗試過這麼遠嗎?爲什麼它不工作?這是作業還是課程作業? – Bobulous 2015-04-04 23:02:08

+1

您需要一個集合來存儲每個球對象。然後你需要檢查他們對方的位置,看看是否發生了碰撞。 quradtree結構是一個有效的解決方案 – 2015-04-04 23:35:39

回答

0

當我寫了這樣一個程序,我結束了創建一個牆對象,它有一個起點X/Y和結束X /年。爲了確定正確的彈跳/反彈角度,需要幾何圖形,因爲牆壁可以處於任何方向。基本上,球的方向改變兩倍於牆和球的方向之間的定向差異。例如,如果球在X軸上方45°移動,並且牆壁在X軸上方90°處(即,它直線上下),那麼球的新標題是其原始標題加上兩個乘以它的航向和牆的方向之間的差值,或換句話說45 * + 2 *(90 * -45 *),換句話說,135 *。問題在於,如果您認爲牆的方向爲-90 *(即X軸下方90度,仍然是直線上下),則該方法不起作用。在這種情況下,你會計算球的新標題爲-45 *,這是錯誤的。如果你從左邊或右邊撞牆,這也很重要。好玩,對吧?很多事情要考慮。

球碰撞時它們的中心是(R1 + R2)的距離彼此的,其中R 1是所述第一球的半徑內,並且R2是第二球的半徑。

從本質上講,我所做的就是我創建的與來自一個球的中心到另一個的中心的矢量是垂直的臨時(不可見)的壁,然後我下令兩個球彈離該壁的。這給了正確的彈跳行爲。

我知道你可能不關心我的「牆碰撞」的東西,但我想我已經描述了可以給你的那種幾何的想法,你會需要,以執行到的東西解決這個問題。

總之,彈跳球正確是困難的。如果不需要和/或您不願意花費精力,請考慮刪除/放棄此功能。

你也可以放在一起不太正確的,但更容易一些。當他們碰撞時,你可以簡單地將球從彼此移開,但是然後你會看到「不自然」的看起來跳投。

我知道它肯定不解決您的問題,但希望這有助於。

0

在Java中,左上角的像素爲(0,0)和左下角是(600600)(當使用BlueJ的作爲環境至少)(取決於窗口大小)。你的邏輯對我來說並不熟悉,但假設你的數學是正確的,當擊球時你的球應該反向,每個球應該有4個if語句。我知道有一些方法可以逃避1或2,而我的方式很醜並且效率不高,但至少它會隔離如果問題是你的邏輯數學問題。

if (X<0) 
{ 
velocity.reverseX(); 
} 
if (X>600) 
{ 
velocity.reverseX(); 
} 
if (Y<0) 
{ 
velocity.reverseY(); 
} 
if (Y>600) 
{ 
velocity.reverseY(); 
} 

我希望這有助於:)