1

衝突可能と呼ばれるオブジェクトのセットが World クラスにあります。

Set<Collidable> collidables = new HashSet<Collidable>();

(ボールの) 衝突検出システムを開発しようとしているときに、X と Y の 2 つの for ループを作成しました。

cboxX = (int) Math.floor(position.x - RADIUS);
cboxY = (int) Math.floor(position.y - RADIUS);
cboxW = Math.abs((int) Math.ceil(nextPosition.x + RADIUS) - (int) Math.floor(position.x - RADIUS));
cboxH = Math.abs((int) Math.ceil(nextPosition.y + RADIUS) - (int) Math.floor(position.y - RADIUS));

for (int x = cboxX; x <= cboxW + cboxX - 1; x++)
{
    for (int y = cboxY; y <= cboxH + cboxY; y++)
    {

    }
}

ここではすべてが良いです。ただし、for ループ内では、x パラメーターと y パラメーターを使用して衝突可能オブジェクトをチェックしようとしていますが、衝突可能オブジェクトの新しいインスタンスを作成しているため (以前に生成されたものとまったく同じパラメーターを使用していますが)、それは常に false になります:

world.collidables.add(new Block(new Vector2(x, y)));
System.out.println(world.collidables.contains(new Block(new Vector2(x, y)))); //returns false

ただし、ブロックの同じインスタンスを使用すると、true になります。

Block b = new Block(new Vector2(x, y))
world.collidables.add(b);
System.out.println(world.collidables.contains(b)); //returns true

ただし、2 つの for ループを使用する全体的な理由は、すべての衝突可能ですべての更新を反復する必要がないため、これは受け入れられません。

私が求めているのは、セット全体を反復することなく、指定した場所に衝突可能性があるかどうかを取得する方法を知っている人はいますか?

4

1 に答える 1

5

2 つのメソッドの独自の実装を提供する必要があります。

int hashCode()
boolean equals(Object o)

これらのメソッドはc1.hashCode() == c2.hashCode()、2 つのインスタンスの属性 (ベクトル) が等しい場合にのみ実装する必要があります。同時に、ドキュメントに記載されている意味でhashCode()一貫している必要があります。equals(Object o)

  • Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、オブジェクトの equals 比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。
  • equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。
  • equals(java.lang.Object) メソッドに従って 2 つのオブジェクトが等しくない場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性があることに注意する必要があります。
于 2013-01-09T03:29:46.830 に答える