1

私は非常に大規模なグリッド ベースの世界で作業しており、そのグリッド スペースの約 50 ~ 90% が常に空であるため、配列ではなく HashMap を使用することにしました。

問題は、基本的な相互作用が正しく機能していないように見えることです。これは、ハッシュマップがキーとして使用している位置と、グリッド オブジェクトが認識している位置との間に何らかの切断があるためだと思います。

これらは私が抱えている問題です:

  • 近隣を検出するオブジェクトの能力は信頼できない
  • オブジェクトの削除は信頼できない

コードは次のとおりです。

getNeighbors方法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クラスの update メソッドからのものです。MarkedForRemovalは、渡されたポイントをスタックにプッシュするだけの を呼び出すjava.util.Stackによって生成される Pointの です。1 フレームに 1 回実行:GridObjectManager.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()新しい GridObjects を追加する唯一の方法です。

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));
}

私が知る限り、Objects.equals() と Object.hashCode() の両方が正しく実装されている場所を格納するために java.awt.Point を使用しています。

私はどこで間違ったのか分からなくなっています。

4

0 に答える 0