2014-09-23 88 views
1

我用C++和SFML 2.1爲學校創建了一個pong克隆,當球以尖銳的角度擊中左槳時,我遇到了一個小問題。球從某個角度穿過槳

右槳在所有角度都能正常工作,並且據我記憶,他們使用相同的代碼。

這是我使用的碰撞代碼:

for (auto& it : collisionPaddles) 
    { 
     if (this->ballShape.getGlobalBounds().intersects(it->getGlobalPaddleBounds())) 
     { 
      float deltaDistance = (this->y + this->radius) - (it->y + it->height/2); 
      bool fromLeft = true; 

      if ((ballAngle < (3*myMath::MY_PI/2) && ballAngle > myMath::MY_PI/2)) 
      { 
       fromLeft = false; 
      } 
      else 
      { 
       fromLeft = true; 
      } 

      ballAngle = static_cast<float>(deltaDistance * (myMath::MY_PI/180)); 

      if (fromLeft) 
      { 
       ballAngle = static_cast<float>(myMath::MY_PI - ballAngle); 
      } 
      moveBall(2); 
     } 
    } 
+0

你能對你的問題闡述的方面的限制,你檢測到衝突用槳?你尖銳的角度是什麼意思?你的意思是球的方向幾乎與槳平行嗎? – OopsUser 2014-09-23 08:57:37

+0

檢測到碰撞。 我沒有任何確切的數字,但如果是> + - 〜40度,它通過 – 2014-09-23 09:02:04

+0

我已經做了一個真棒圖片說明(綠角度做工精細,紅色穿過): HTTP:// oi61。 tinypic.com/15zhw78.jpg – 2014-09-23 09:08:39

回答

0

這不是一個很好的乒乓球應該實現的方式。當你的物理模型使用一些三角洲時,你會得到很多文物。最突出的是彼此穿過的物體。在這種簡單的情況下,deltas只能用於動畫。

這是我解決它的方法。當球獲得其初始速度和運動向量時,我會計算整個路徑,直到它達到球員的基線。

  1. 從球的當前位置計算初始射線,指向與其移動方式相同。
  2. Intersect that ray with segments組成您的領域的邊界。
  3. 計算達到該交點所需的時間。
  4. 計算從交點到新運動矢量的新射線。
  5. 重複步驟2-4直到你擊中玩家的基線。總結所有時間。

現在你有一個相對時間的基線和發生的地方。現在在每一幀你應該

  1. 檢查是否碰撞時間之間的前一幀和當前之一。如果是這樣,
  2. 計算當時槳的預期位置。
  3. 如果槳葉段包含該交點,則會反映出來。如前所述計算新路徑。

這樣你會得到真正的遊戲機制不是由大多數的遊戲開發,即FPS,突然滯後等

+0

你有代碼示例嗎? 從它的聲音(沒有關於主題的知識)來看,對於我來說在短時間內執行起來聽起來太複雜了。 新的C++和'項目'只是一個小型的學校任務。 – 2014-09-23 13:20:04