2012-04-27 170 views
1

我搜索碰撞檢測主題,但他們都是關於檢測本身。我的問題更多的是在檢測過程之前和之後。我正在寫我的第一場大型比賽,我想盡可能提高效率。設置碰撞檢測,然後處理2D遊戲中的碰撞

遊戲的前提是你在遊戲區周圍飛行。在這個領域將會成爲環境,敵艦,以及在太空中漂浮和漂浮的拋射物所提供的不同性質的障礙。如果需要或想要,對象將能夠圍繞其中心旋轉。

我的設置測試的想法是讓對象以某種方式加載到隊列和列表中。然後遊戲將採取隊列前面的任何內容並對列表中的所有內容進行測試。它會首先檢查以確保列表中的東西不是自己的(這會一直產生一切碰撞的聲音)。接下來,遊戲將檢查隊列中的對象與列表中的對象之間是否存在衝突。如果發生碰撞,那麼它會標記對象說他們已經發生碰撞,並保存一個參考或任何物體碰撞的內容。例如,如果A與B碰撞,則遊戲會告訴A運行碰撞函數,B運行碰撞函數,並且將存儲到A中對B的引用,B將存儲對A的引用。

然後,遊戲將繼續檢查隊列中的對象的衝突,直到它遍歷列表爲止,每次執行上述操作以說明多個對象擊中或被多個對象擊中的對象。例如,如果有三個球,A,B和C以及A​​在同一幀中被B和C兩者擊中,則A的速度將被B修改,然後被C修改,並且B和C的速度將由A修改。

這樣做是否明智?我現在並不擔心實際發現的碰撞事件,還有大量的文章或教程以及我自己的想法來解決這個問題。我沒有遇到任何前後談過的事情。我不確定隊列和列表中有多少東西會開始導致大量負載並降低遊戲速度。現在我的物體都只有x,y位置,x,y速度,他們面對的方向以及其他一些東西。

現在我想我開始漫無邊際的事情了。任何洞察力或智慧將不勝感激。

+0

移動向量是否在您遍歷隊列時更新?看起來B和C的運動向量會被A _after_ A修改後的運動向量發生變化。 – 2012-04-27 16:34:44

+0

它會保存舊值和新值,運行檢測過程,然後所有對象會根據需要進行更新。所以在這個例子中,A會與B進行交互,A會保存新的速度。然後,它會與C進行交互,C會修改並保存更新的速度。然後,一旦遊戲退出檢測,它會運行一個過程來更新對象,使他們使用他們的新速度或做任何事情。 – Azaral 2012-04-27 16:51:25

+0

是的,但是當你計算C的新速度時,C不會使用A的新速度嗎?假設我可以想到最簡單的碰撞響應,其中A具有起始速度(0,1)並且C具有(0,-1),B也具有(0,-1),A與B中的C和C碰撞相同的幀,首先它被B修改,給出A速度(0,-1),然後它與C碰撞,但是因爲它們具有相同的速度矢量,所以它們都不會改變(或者它們都在相同方向上增加速度)。或者你的意思是新的速度存儲在一個新的列表中,並且在所有計算完成後交換這些列表? – 2012-04-27 16:57:30

回答

2

對於許多遊戲開發主題,沒有通用的答案,這一點,它取決於你的類型的遊戲,但保留一些東西記住,當涉及到你的對象的遍歷:

  • 嘗試想想如何在碰撞檢測後做出實際反應(你會使用雙重調度,訪問者,向下轉換/ rtti,存儲可以在功能圖中使用的特徵,...)。有多種技術,都有其優點和缺點。你選擇的方法可以反映你如何做實際的遍歷。
  • 嘗試分割對象類型的場景。例如,如果你有很多永遠不會移動的靜態對象,那麼將所有對象進行測試都是荒謬的,你應該將它們分開。但作爲一個經驗法則,不要試圖專門化這個太多,像staticdynamic可能會帶來很大的好處,有100個類型將產生通常沒有真正的收益維護地獄。
  • 這可能與您的遮擋機制有關。例如,如果它是基於門戶的,則來自不同單元格的對象將不可能碰撞。

我現在可能忘了一些其他的提示,因爲這是一個複雜的話題,但我希望它能讓你走。

+0

有一些很好的教程的鏈接,對於其中的一些東西,最好是一步一步地完成。我最難學習的東西只是通過閱讀,需要看到它發生並解釋。 – Azaral 2012-04-27 17:42:20

+0

@Azaral:我所知道的關於碰撞檢測的大部分內容來自經驗或閱讀獨立文章。我無法真正推薦一本書或教程。 – KillianDS 2012-04-28 10:27:42

+0

好的,謝謝。 – Azaral 2012-04-28 12:21:30