Data structures 2d平铺图-如何知道给定平铺上有哪些单位?

Data structures 2d平铺图-如何知道给定平铺上有哪些单位?,data-structures,Data Structures,我有一个游戏,它是一个基于2d瓷砖的地图。看起来像一个巨大的棋盘。玩家可以在牌上有单位。我需要一种有效的方法来确定哪些单元位于给定的瓷砖上。原因是我不想在将一部分贴图渲染到屏幕时减慢渲染循环。我不想花太多时间去寻找哪个单位在哪个瓷砖上 现在我想到一个如下的哈希映射: // Java pseudo-code: Map<Integer, List<Unit>> units = new HashMap<Integer, List<Unit>>(); /

我有一个游戏,它是一个基于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));
        }
    }
 }
//Java伪代码:
映射单位=新的HashMap();
//将一个单元放置在平铺x、y处:
int xy=y*mapWidth+x;
列表匹配=单位。获取(xy);
如果(匹配==null){
匹配=新的ArrayList();
单位。放置(xy,匹配);
}
匹配。添加(新飞机());
//将地图的一部分渲染到屏幕上,例如20,5到50,17
对于(int y=5;y<17 y++){
对于(int x=20;x<50;x++){
列表匹配=单位。获取(y*mapWidth+x);
if(matched!=null&&matched.size()>0){
绘制(匹配。获取(0));
}
}
}
如果我有巨大的地图,玩家在地图上的每一块瓷砖上都放置了一个单位(不太可能发生),我可以看到这会成为一个问题。在这种情况下,我的hashmap中有mapWith*mapHeight条目,每个值本身就是一个数组

这是我对这个问题的天真看法,如果有其他方法可以提高查找速度,或者在上面的情况下,单位占据了地图的每一块瓷砖,我将不胜感激


谢谢

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


我有一种感觉,更好的办法是从一个单元往上看。如果单位的数量在大部分时间内少于平铺(一般情况下,直到你没有开发hurly burly Combination游戏),那么从单位到当前平铺窗口的查找就更好了。

你不能使用列表矩阵吗?我可以,但我不必预先分配mapWidthmapHeight元素吗?(可能我误解了-假设您的意思是List[]map=new ArrayList[mapWidthmapHeight]?)