2014-02-05 33 views
0

我在CodeSkulptor(python 2)中寫了一個簡單的空氣曲棍球風格的遊戲。 3圈,基本上是兩個槳和一個球。我瞭解如何檢測圓圈之間的碰撞,但我發現很難準確地模擬該圓圈如何從用戶控制的圓圈反彈。用戶控制的圈(槳)傾向於消耗球並且球卡住。我認爲我的球在牆上反彈的代碼與我爲槳碰撞所寫的代碼非常相似。如何檢測兩個圓之間的碰撞點,然後創建一個矢量來更新圓的位置?

我讀了一些其他帖子,我發現我需要得到碰撞點,然後以某種方式將它變成矢量來更新球的位置。任何人都可以幫助我嗎?此外,事實槳是用戶控制複雜的事情?我猜測對球的影響必須考慮到槳的矢量?

感謝您的回覆,請保持數學儘可能簡單。

克里斯

+0

你問一個很好的問題。答案在某種程度上取決於您希望遊戲玩法的工作方式。您可以選擇一個非常簡單的模擬或完全真實的模擬。我建議從最簡單的方程開始,以便讓它運行,然後再決定是否需要更精確的模擬來使遊戲變得有趣。你也可以嘗試一下這樣的書:爲遊戲程序員開始數學和物理(http://www.amazon.com/Beginning-Math-Physics-Game-Programmers/dp/0735713901/ref=sr_1_1?s=書籍&ie = UTF8&qid = 1391634202&sr = 1-1&keywords = 0735713901) – Kevin

+0

是的,我認爲從最簡單可行的解決方案開始將是最好的,因爲我試圖教自己如何製作遊戲,並通過擴展一些物理和數學。感謝您的鏈接,只需要找到一個免費版本,我就定了。 – user3276942

回答

1

解決方案1 ​​

,對我和任意形狀的行之有效的算法是

  1. 動圈
  2. 測試,如果它重疊
  3. 如果重疊:將其移回
  4. 讓它改變方向。

這樣你不應該卡住,如果其他部分沒有同時移動。因爲通過後退,你不會重疊,並做mot觸發反彈和改變方向兩次。

溶液2

使用矢量和僅圈:

circle1x, circle1y, circle1radius, circle2x, circle2y, circle2radius 

if (circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2 < (circle1radius + circle2radius) ** 2: 
    # they overlap using http://en.wikipedia.org/wiki/Pythagorean_theorem 
    # compute new direction 

變化方向

計算新的方向可以忽略兩個圓的速度,但不看很自然。

old_direction1 = (v1x, v1y) 
velocity1 = (v1x ** 2 + v1y ** 2) ** 0.5 
old_direction2 = (v2x, v2y) 

distance = ((circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2) ** 0.5 
new_direction1 = ((circle1x - circle2x)/distance * velocity1, 
        (circle1y - circle2y)/distance * velocity1) 
new_direction2 = ((circle2x - circle1x), ...) 

但是,您可以使用這個新的方向和舊的方向來創建一個看起來更自然的新方向。我沒有測試了這一點,但它應該是這個樣子:

combined_direction = old_direction + 2 *(old_direction dot-product new_direction)* new_direction

點積爲您提供了投射到一些矢量有方向讀。

而且,一旦你得到這個你可以考慮創建圈子如何重,彈性碰撞:http://en.wikipedia.org/wiki/Collision

+0

感謝您的詳細解答,我會盡力回覆。 – user3276942