私は非常に大規模なグリッド ベースの世界で作業しており、そのグリッド スペースの約 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 回実行: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()
新しい 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 を使用しています。
私はどこで間違ったのか分からなくなっています。