2010-10-28 54 views
0

嘿傢伙!我的物理引擎相當漂亮(感謝提問!),我準備開始研究一些更高級的垃圾。舉例來說,我試圖設置我的碰撞引擎,以便在發生碰撞時通知任意委託人。讓我給你設置一個場景:碰撞檢測代理方案

假設我們在物理模擬中有對象A,對象B和對象C.我希望能夠通知代表A和B之間發生衝突,並通知潛在的不同代表A和C之間發生衝突。

有點背景信息:我有一個已知的委託接口,I有可能爲我的碰撞檢測器存儲狀態(但不要atm),並且有能力將狀態存儲在對象本身中。同樣,我使用這個委託模型來處理衝突解決方案,只需將物理引擎默認設置爲所有對象的委託,允許用戶根據需要更改委託。

現在,我已經嘗試讓每個對象存儲它自己的碰撞委託,當發生碰撞時會通知它。這不起作用,因爲當對象具有相同的碰撞委託時,相同的碰撞被處理兩次。當我切換到只使用第一個對象的委託(但是已經決定)時,仿真的順序成了一個問題。我想使用一個字典,但是會引入大量的開銷。但是,這似乎是我需要指引的方向。

所以,這裏的問題是:通過合適的解決方案與死亡作鬥爭。你會如何解決這個問題?

回答

1

我必須說,兩個對象可以有不同的委託(碰撞時)有點奇怪,如果兩個相同的委託在碰撞時發射,它仍然會很糟糕。我好像他們應該一直開火,或者只有其中一人應該開火。一致性是困擾我在這裏。 解釋這將有助於更多。第二,如果你使用爲每個對象持有一個委託的樸素版本,然後調整激活它的功能(「如果(!一些布爾值表示這個委託已經被觸發){做一些事情}」),這可以解決開銷很小。 它的工作原理,但我不喜歡這種類型的代碼。

我的建議(有點複雜,所以在開始工作之前先考慮一下)是試圖關注一個管理器對象,該對象將遍歷所有代表並調用與碰撞相關的兩個對象。 例如,A和B發生碰撞,並且管理器與它們一起作爲參數被調用。您現在可以遍歷系統已知的所有委託(假設它們很少),並激發與「委託== a.del或委託== b.del」相匹配的委託。 這會帶來更大的開銷,但是如果我們談論的是少數代表,那麼如果沒有什麼區別的話。另一方面,這將允許您將來在這個區域更多地使用碰撞檢測引擎(比如每個對象存在多於一個代表)。

+0

你的建議是有根據的。我正在設計類似的東西:一個控制器對象將物理對象作爲關鍵字來獲得委託值。然後該代表被稱爲兩個對象之間產生的碰撞。所以當A和B碰撞時,控制器查找與A和B相關聯的委託,然後當A和C發生碰撞時,它查找與A和C相關的委託。你是對的:這在存儲和複雜性方面成本很高。感謝您的建議! – Grimless 2010-10-30 18:25:15

+0

我決定爲每個對象類型設置代表,這似乎是一個可接受的解決方案。謝謝! – Grimless 2010-11-06 03:55:16