3

次のように、長方形の単純な 2D 衝突検出を実装するのが良い考えかどうかを知りたいです。

  1. Rectangle クラスを拡張した独自の衝突検出クラスを作成します。
  2. 次に、そのオブジェクトを次のようにインスタンス化するときCollision col = new Rectangle();<- 私はそれをすべきですか、それとも避けるべきものですか? 「できる」ことは承知していますが、そうすべきですか?
  3. contains()およびintersects()メソッドのために Rectangle クラスを拡張したい。Javaで2D衝突検出のためにそれを行うべきですか、それとも何か他のことをするべきですか?
4

3 に答える 3

7

is-aCollision と Rectangle の間には関係がありません。衝突は Rectangle ではありません。衝突ドメインには、構成を使用することを示唆する長方形が含まれる場合があります。

于 2010-03-19T16:28:09.860 に答える
2

簡単に延長できますRectangle

class CollidableRectangle extends Rectangle
{
  public boolean isCollidingWith(Rectangle otherRect)
  {
    //check collision
  }

  // return all collisions
  public List<CollidableRectangle> getCollisions(List<Rectangle)
  {
    // code
  }
}

次に、次のように使用します。

CollidableRectangle r1 = new CollidableRectangle();
CollidableRectangle r2 = new CollidableRectangle();

r1.isCollidingWith(r2);

//and so on

Collisionコメントで述べたように、私はクラスを使用しませんでした。通常、深度衝突面などの衝突パラメータにも関心があるため、次のようなものが必要になるため、これが必要になります。

class Collision
{
   CollidableRectangle first, second;
   float depth;
   Line2D collidingLine;
}

メソッドは衝突のリストを返します。

public List<Collision> getCollisions(List<Rectangle) { ... }
于 2010-03-19T16:26:42.880 に答える
0

そもそもRectangleとは無関係にするのはどうですか?新しいスタンドアロンのCollisionモジュールを作成し、必要なさまざまなタイプを処理します。

(私はJavaを知りません、ここで問題が発生したことをお詫びします)

class Collision
{
   public boolean BetweenRectangles(Rectangle a, Rectangle b)
   {
   }

   public boolean BetweenCircles(Circle a, Circle b)
   {
   }

   public boolean RectangleToCircle(Rectangle r, Circle c)
   {
   }

   public boolean MyCrazyShapeToRectangle(MyCrazyShape mcs, Rectangle r)
   {
   }
}

私見では、衝突は長方形に直交する概念であり、それらを一緒に妨害すると将来のオプションが不必要に制約されるため、長方形から衝突を作成することは実際には意味がありません。理解しておくべき重要なことは、衝突オブジェクト自体は実際には必要ないということです。これらの関数は本質的に手続き型です(Javaにはクラススコープメンバー関数用のC ++の「静的」修飾子のようなものがありますか?)。衝突自体は、衝突の参加者のどちらの所有物でもありません。

于 2010-03-19T16:51:04.960 に答える