2012-07-21 54 views
3

我一直在C#編碼幾年,現在決定嘗試XNA框架來製作遊戲。XNA碰撞檢測與遊戲速度對比

它很好,直到我開始在我非常簡單的遊戲中實現碰撞處理。

我可以理解如何使用BoundingBoxes和BoundingSpheres進行碰撞檢測,但是在查看遊戲中的刷新率之後,如果兩個碰撞對象從未被檢測爲碰撞,它很快成爲我的一個擔憂。

讓我試着用一個例子來解釋: - 如果一個角色用另一個角色的槍射擊。 - 子彈直奔其他角色。 - 子彈在角色前面呈現。 - 由於子彈高速度,它現在在角色的另一側呈現。

在這種情況下,項目符號和角色從不發生衝突,因爲它們永遠不會呈現在它們的碰撞狀態。

那麼如何確保在這種情況下檢測到碰撞?

回答

1

對於非常快速移動的對象,常規方法在您描述的場景中失敗。你需要檢查的是子彈是否與兩個連續遊戲節拍之間的間隔中的任何項目相沖突。這被稱爲continuous collision detection (this is a rather related SO post)

您可以通過基本鑄造子彈的結合框在當前位置的中間,從舊的位置盒子的中間之間的線,並與任何其他塊檢查是否碰撞做到這一點/球體。這是一個相當快的解決方案,如果你的子彈足夠小,它應該可以正常工作。

爲了更加精確,您可以將當前項目符號框每個角的四個不同所謂的碰撞射線投射到前一個遊戲刻度的相應位置。請注意,在罕見的高速物品比子彈小的情況下,這可能也會失敗。在這種情況下,您需要更先進的碰撞檢測系統。但這只是一個角落案例。

如果這個額外的精度是必須的,一個免費的3D物理庫,如Bullet可以代表一個解決方案。它甚至有bindings for XNA

+0

另請注意,每次您使碰撞檢測更復雜時,性能問題都會開始顯現。我所做的是創建一個ThreadPool並傳遞所有可碰撞對象的框架,並且每個可碰撞對象都有一個碰撞事件。 ThreadPool允許在所有可用的線程上進行衝突檢測。 – 2012-07-21 19:00:15

1

我認爲你的問題是在與你的描述相匹配的隧道中。

我建議你爲XNA使用Box2D物理引擎。它速度快,簡單,並且可以避免您在遊戲中遇到任何碰撞問題。

登錄this manual第4頁連續碰撞並檢查Box2D如何處理隧道效應。

+0

+1好答案,但由於這需要第三方庫,我更喜歡其他答案。 – reSPAWNed 2012-07-21 13:56:33