2012-09-13 118 views
0

我有一個遊戲,這是一個基於2D的地圖。看起來像一個巨大的棋盤。玩家可以在瓦片上放置單位。我需要一種有效的方法來確定哪些單位位於給定的瓷磚上。原因是我不想在渲染地圖的一部分到屏幕時減慢我的渲染循環。我不想花太多時間找到哪些單位在哪個平鋪。2d瓷磚地圖 - 如何知道給定瓷磚上的哪些單位?

現在我想哈希映射,像這樣:

// Java pseudo-code: 
Map<Integer, List<Unit>> units = new HashMap<Integer, List<Unit>>(); 

// place a unit at tile x,y: 
int xy = y * mapWidth + x; 
List<Unit> matched = units.get(xy); 
if (matched == null) { 
    matched = new ArrayList<Unit>(); 
    units.put(xy, matched); 
} 
matched.add(new Airplane()); 

// render a portion of the map to screen, say tiles 20,5 to 50,17 
for (int y = 5; y < 17 y++) { 
    for (int x = 20; x < 50; x++) { 
     List<Unit> matched = units.get(y * mapWidth + x); 
     if (matched != null && matched.size() > 0) { 
      draw(matched.get(0)); 
     } 
    } 
} 

我可以看到這成爲一個問題,如果我有巨大的地圖,玩家把一個單位每瓦在地圖(不太可能即將發生)。在這種情況下,我會在我的散列映射中使用mapWith * mapHeight條目,並且每個值本身就是一個數組。

這是對這個問題我幼稚起飛,將不勝感激任何的替代品,以提高查找速度或者單位佔據了地圖的每瓦以上的情況下,

感謝

+0

難道你不能使用列表矩陣嗎? –

+0

我可以,但是之後我不需要預先分配mapWidth * mapHeight元素嗎? (也許我誤解 - 假設你的意思是列表 [] map = new ArrayList [mapWidth * mapHeight]?) – user291701

回答

0

這種做法我覺得遭罪在更新方案。如果大多數單位要更改其位置,則會更新查找中的基礎列表對象。因此,您需要首先查找舊位置的查找列表,然後查找新位置並執行相同操作。這消除了hashmap的好處。

我有一種感覺,更好的想法是從單位看瓷磚。如果單位數量少於大多數時間的瓦片數量(一般情況下,直到您沒有開發骯髒屠殺遊戲),那麼從單位到當前瓦片窗口的查找效果會更好。