我正在使用一个非常大的基于网格的世界,它在任何给定时间都有大约50-90%的网格空间为空,因此我选择在数组上使用HashMap。
问题是基本交互似乎没有正常工作,我认为这是因为hashmap用作键的位置与网格对象知道它的位置之间存在某种脱节。
这些是我遇到的问题:
以下是代码:
getNeighbors
的{{1}}方法:
GridObject
这来自public ArrayList<GridObject> getNeighbors()
{
ArrayList<GridObject> neighbors = new ArrayList<GridObject>(8);
final int[] d = {-1, 0, 1};
for(int i : d)
for(int j : d)
if(j != 0 || i != 0) // Don't use (0, 0)
{ // Manager is just a wrapper for the HashMap; treat this like HashMap.get()
GridObject p = manager.get(location.x + i, location.y + j);
if(p != null) neighbors.add(p);
}
return neighbors;
}
类的更新方法。 Manager
是由MarkedForRemoval
填充的java.util.Stack
点GridObject
,只调用Manager.markForRemoval()
,只是将传递点推入堆栈。 update()
每帧运行一次:
public void update()
{
// libgdx graphics stuff
renderTarget.setColor(new Color(0f, 0f, 0f, 0f));
renderTarget.fill();
for(GridObject p : map.values())
{
renderTarget.drawPixel(p.location.x, p.location.y, Color.rgba8888(p.team.getColor()));
p.update();
}
while(!markedForRemoval.isEmpty())
map.remove(markedForRemoval.pop());
}
这是Manager.put()
方法,这是添加新GridObject的唯一方法:
public GridObject put(int x, int y)
{
final Point p = new Point(x, y);
return map.put(p, new GridObject(this, p));
}
最后是Manager.get()
方法:
public GridObject get(int x, int y)
{
return get(new Point(x, y));
}
据我所知,我正在使用java.awt.Point存储位置,这些位置正确实现了Objects.equals()和Object.hashCode()。
我对自己出错的地方感到迷茫。