3

我想知道实现矩形的简单二维碰撞检测是否是一个好主意,如下所示:

  1. 制作我自己的扩展 Rectangle 类的碰撞检测类。
  2. 然后在实例化该对象时执行诸如Collision col = new Rectangle();<- 我应该这样做还是应该避免这样做?我知道我“可以”,但我应该这样做吗?
  3. contains()由于andintersects()方法,我想扩展 Rectangle 类;我应该这样做还是应该为 Java 中的 2D 碰撞检测做其他事情?
4

3 回答 3

7

碰撞和矩形之间没有is-a关系,碰撞不是矩形。冲突域可能有矩形,这表明您使用组合

于 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 无关怎么办?制作一个新的独立碰撞模块并处理您想要的任何不同类型。

(我不懂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 回答