关于Hashmaps和2D网格的问题

时间:2012-04-22 20:10:02

标签: java grid hashmap 2d libgdx

我正在使用一个非常大的基于网格的世界,它在任何给定时间都有大约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.StackGridObject,只调用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()。

我对自己出错的地方感到迷茫。

0 个答案:

没有答案
相关问题