2011-05-08 63 views
1

我正在製作一個塔防遊戲,我希望防禦炮塔能夠在射程範圍內最遠的攻擊單位進行射擊。我使用java編程並使用ArrayLists來保存單元。如何按順序保存路徑中的單元列表?

到目前爲止,我已經將路徑分成了不同的塊,每個塊都有一個單元列表。當一個單元離開塊時,它會傳遞到路徑上的下一個塊。如果所有單元都以相同的速度移動,那麼很容易跟蹤哪個單元最遠,因爲它將是列表中的第一個單元。但我希望單位能夠以不同的速度移動。

當一個單位被添加到一個塊時,它將被添加到數組列表的末尾。因此,之前添加的單位位於列表的前面,最近添加的單位位於列表的末尾。

我最初的想法是讓每個單元在arraylist中檢查比它低的單位,看看它們是否沿着路徑走得更遠。如果是的話,它會將陣列列表移到正確的位置。這類似乎是大量額外的工作,我恐怕會減慢比賽的速度。

這是一個好主意,還是應該嘗試其他方法?我可以發佈一些代碼,如果它會幫助。

回答

2

我不確定ArrayList是你最好的選擇。我認爲在遊戲中的每個「嘀嗒」中,每個單位都會移動一個指定的距離,這意味着你將碰撞單位,在列表中移動和移出對方。

我也在假定每個「塊」比1更深。這意味着對於每個「嘀嗒」,給定單位可以在另一個塊內移動得更遠,並且如果一個單位達到了一個塊,下一個刻度將它碰到下一個塊。

選項1(平庸):

使用Map<Integer, Set<Enemy>>其中整數是從0 - BLOCK_DEPTH和每個敵人看到跳躍從一組到另一個。這裏沒有排序;只是指針重新分配。您也只需要做一個map.get(0)並添加到nextMap.get(BLOCK_DEPTH)

選項2(更好?):

使用SortedSet實現基於Enemy.position比較,其中位置是0 - BLOCK_DEPTH整數。每個敵人都有一個聽衆更新它在tick上的位置,然後通過彈出Set Enemy.position爲0的元素,將他們推到下一個集合上來開始每個tick。

+0

我現在正在實施您的第二個選項,它看起來會很好。我唯一的問題是,即使我更新了攻擊單位的位置,樹木會保持有序嗎? – Jonathan 2011-05-08 05:21:54

+0

我已經爲每個塊實現了一個單獨的樹形結構,並且它大部分時間都在工作,但有時當某個塊試圖從樹形結構集中刪除一個單元時,它不會。通過一些斷點,我可以看到該單元在樹形結構中,並傳遞到下一個塊,但是一些treeset.remove(unit)返回false的方式。 – Jonathan 2011-05-08 07:05:53

+0

我相信TreeSet的排序是根據需要計算的 - 即當您嘗試遍歷它或者當您彈出最低值時。這就是爲什麼我認爲它適合你。 ArrayList一直擔心訂購。你只關心抓住每組中的「最低」並將它們移動到下一組。如果treeSet.remove()返回false,則表示該對象不在該集合中。我不得不看代碼來找出那裏有什麼問題,雖然也許這是一個不同的話題。 – jbrookover 2011-05-08 13:29:55

0

你可以計算出每個單位產生時到本壘的距離,然後減去單位移動時的移動量。然後,每座塔將通過列表,看看哪個單位距離本壘最近。

您可以使用原始距離A* path finding,計算單位將通過的塊數並乘以塊的大小,或者執行簡單的直線距離。根據您的遊戲佈局,您最瞭解。

public static double Get2DDistance(float x1, float y1, float x2, float y2) { 
    float dx = x2 - x1; 
    float dy = y2 - y1; 
    double distance = Math.sqrt(dx * dx + dy * dy); 
    return distance; 
} 
+0

其實因爲你可能有單位產卵在同一個地方。你只需要在每個重生點計算一次距離。然後將該距離分配給在該點產生的每個單位。 – MichaelHouse 2011-05-08 06:32:39

相關問題