2012-08-30 145 views
3

我正在使用LWJGL和Java 1.6一起編寫一個2d自上而下的RPG遊戲。到目前爲止,我的渲染和輸入方法工作正常,並開始編程遊戲的邏輯。處理碰撞實體

所以我有一個名爲World的類,它包含一個實體ArrayList。我想在遊戲中實現簡單的碰撞(使用相交正方形),這應該不成問題。我現在唯一的問題是如何訪問我的列表中的單個單元格,而無需遍歷它。我只能想出在每個實體中執行的碰撞​​方法,並遍歷我的世界中的所有實體。這並不快,但我真的不知道該怎麼做才能讓它更快。

我的遊戲是基於瓦,但運動不是瓷磚到瓷磚,一個能走小部分,避免了我只需使用二維數組...

有沒有一個標準的方法處理實體及其碰撞? (或者可能是一種處理ArrayList內部實體之間碰撞的方法?)

+0

您的所有實體是否都位於2D平面上? 你如何跟蹤他們的位置?有多少實體在同時移動?事實上,究竟有多少實體? – Vitaliy

+0

我無法確切知道有多少實體,但我認爲通常會有500個實體同時移動。是的,所有的,都在飛機上。它們的位置在每個對象內都以雙重形式存儲。它被重新調整以適應瓷磚網格。 – Thiago

+0

好的,另一個問題是:你說「我現在唯一的問題是如何訪問我的List中的單個單元,而不必遍歷它。」您如何知道首先需要移動的部分? – Vitaliy

回答

1

處理碰撞實體的標準方法是空間分割。你的世界是由離散點組成的二維平面。 每件可以位於其中一個點上。點的數量決定了飛機的分辨率 - 點數越多,視覺效果越好,您需要執行的計算越多。這是權衡。

您可以維護實體的位置與實體本身之間的映射,其中位置由覆蓋equals和getHashCode的對象表示。位置對象包含兩個成員 - X和Y座標。

注意 - 您必須以適當和有效的方式覆蓋。

所以,如果你知道它的座標,你可以非常快速地訪問每個實體,重新洗牌只是刪除一個實體並添加新的座標(這可以針對本地進行優化)並且碰撞檢測是微不足道的 - 只需檢查相同位置被某個實體佔用。

我也會在SO上提及你this question

+0

謝謝。那就是要走的路了=) – Thiago