2013-01-13 47 views
1

我有一個彈跳球的應用程序,我必須擴展它以防止重疊的球。執行彈跳球碰撞檢測

當球與另一個球重疊時,他們應該離開現實生活。

enter image description here

我不得不延長給定MoveBall方法:

 private void MoveBall() 
    { 
     prevX = x; 
     prevY = y; 
     x += xVelocity; 
     y += yVelocity; 

     // Is there too closed ball? 

     foreach (Ball ball in parentForm.balls) 
     { 
      distance = Math.Sqrt(Math.Pow((double)(ball.prevX - prevX), 2) + 
           Math.Pow((double)(ball.prevY- prevY), 2)); 
      overlap = ((radius + ball.radius) - distance);// +ball.radius; 

      if (ball.id != this.id && 
       ball.id != lastID && 
       overlap > 0) 
      { 
       lastID = this.id; 
       if (xVelocity > 0) // roading right 
       { 
        xVelocity = -xVelocity; 
        x -= xVelocity - ball.xVelocity; 
       } 
       else if (xVelocity <= 0) // roading left 
       { 
        xVelocity = -xVelocity; 
        x += xVelocity + ball.xVelocity; 
       } 
       if (yVelocity > 0) 
       { // going up 
        yVelocity = -yVelocity; 
        y -= yVelocity - ball.yVelocity; 
       } 
       else if (yVelocity <= 0) // down 
       { 
        yVelocity = -yVelocity; 
        y += yVelocity + ball.yVelocity; 
       } 

      } 
     } 

     // *********************************************** 
     // ***************** END MY CODE ***************** 
     if (x > parentForm.Width - 10 - (radius) || x < 0) 
     { 
      if (x < 0) x = 0; 
      if (x > parentForm.Width - 10) x = parentForm.Width - 10 - radius; 
      xVelocity = -xVelocity; 
     } 
     if (y > parentForm.Height - 40 - (radius) || y < 0) 
     { 
      if (y < 0) y = 0; 
      if (y > parentForm.Height - 40) y = parentForm.Height - 40 - (radius); 
      yVelocity = -yVelocity; 
     } 

    } 

X,Y,xVelocity,yVelocity,半徑,prevX,prevY聲明爲INT。

重疊,距離爲一倍。

當2重疊時,它們會卡住。爲什麼?

不幸的是,我不能上傳所有的源代碼,因爲有很多模塊。 我正在使用Visual C#Express 2010.

+4

不幸的是,你在這裏寫的東西並不適合Stack Overflow。你需要先解決問題;找出出錯的代碼,然後構造一個[** minimal ** test-case](http://sscce.org)來演示它。測試案例包括輸入和輸出。 –

+2

你的問題是什麼?我讀過你的代碼和班級,我無法區分你想要解決的問題。您是否要求某人提供完整的解決方案 - 如果沒有,請提供該問題的更具體細節,因爲它看起來有點像您。 首先描述對象模型和接口,以便人們可以理解如何引用和調用方法來詢問(並可能改變狀態)每個'Ball' – JustinJDavies

+0

@JustinJDavies當球重疊時,搬走。這是問題。 – Billie

回答

0

當我第一次嘗試碰撞檢測算法時,偶然發現了類似的問題,我會盡力描述我認爲的問題。

也許球的移動速度足夠快,以至於在碰撞之前,甚至可以通過您的代碼檢測到它們,它們之間已經部分「內部」了。當碰撞檢測出現並注意到時,它會做它應該做的事情:根據剛發生的碰撞細節改變對象的計劃軌跡。問題在於,因爲這些對象在碰撞檢測捕獲它們之前得到了排序 - 「合併」,所以它們不會因爲碰撞檢測再次被觸發而相互陷入它們之間而不被釋放。

如果這是問題的根源,那麼也許上面的代碼可以使用足夠小的速度向量。當然,這不是一個真正的解決方案,但如果它確實適用於非常小的速度,那麼它可能證實了我的假設,並且您對如何進行操作有一些想法。

2

由於沒有明確提出問題,我會假設「爲什麼球粘在一起?」這個問題。

您只在源代碼中顯示了一個循環,這還不夠;-)要檢查所有可能的衝突,您需要檢查n *(n-1)/ 2個可能的衝突。這通常是用兩個循環完成的。你必須小心翼翼地採取措施避免兩次碰撞。

你的球卡住的原因是你多次處理相同的碰撞。例如兩個球完全水平碰撞:左邊的速度爲5,X的位置爲100.另一個球的位置爲110,速度爲-6。當碰撞發生:

  1. x被設定爲檢測105
  2. 碰撞:x被設定爲104和速度至-5。
  3. 其他球處理相同的碰撞:
  4. 他移動按照他的速度定位104
  5. 衝突處理:他的速度變得6和位置變成105

的球在100和110人。並已移至104和105.雖然速度現在彼此相反,但下一步中的碰撞處理將再次反轉。所以位置靠得很近,速度在每一幀都在變化。球看起來「互相粘在一起」。

我希望答案能幫助你理解你的問題。爲了更好地實現彈性碰撞(處理每次碰撞只需一次),請看這裏:Ball to Ball Collision - Detection and Handling

+0

非常感謝。什麼是'碰撞=碰撞/距離'?'做什麼? – Billie

+0

碰撞是一個二維向量,距離被定義爲碰撞的長度。該代碼正常化的矢量長度只有一個。 –