2d瓷砖地图 - 如何知道哪个单位在给定的瓷砖?

时间:2012-09-13 19:25:33

标签: data-structures

我有一个游戏,它是一张基于图块的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));
        }
    }
 }

如果我有巨大的地图,玩家会在地图中的每个图块上放置一个单位(不太可能发生),我可以看到这成为一个问题。在那种情况下,我的hashmap中有mapWith * mapHeight条目,每个值本身就是一个数组。

这是我对这个问题的天真看法,会感谢任何提高查找速度的替代方案或上述单位占据地图每个图块的情况,

由于

1 个答案:

答案 0 :(得分:0)

我认为这种方法在更新方案时会受到影响。如果您的大多数单位要更改其位置,则会导致查找中的基础列表对象更新。因此,您需要首先查找旧位置的列表以进行修改,然后查找新位置并执行相同操作。这消除了hashmap的好处。

我有一种感觉,更好的想法是从一个单元向另一个单元查找。如果单位数量少于瓦片大部分时间(一般情况,直到你没有开发喧嚣的大屠杀游戏),那么从单位到当前瓦片窗口的查找更好。