我想知道实现矩形的简单二维碰撞检测是否是一个好主意,如下所示:
- 制作我自己的扩展 Rectangle 类的碰撞检测类。
- 然后在实例化该对象时执行诸如
Collision col = new Rectangle();
<- 我应该这样做还是应该避免这样做?我知道我“可以”,但我应该这样做吗? contains()
由于andintersects()
方法,我想扩展 Rectangle 类;我应该这样做还是应该为 Java 中的 2D 碰撞检测做其他事情?
我想知道实现矩形的简单二维碰撞检测是否是一个好主意,如下所示:
Collision col = new Rectangle();
<- 我应该这样做还是应该避免这样做?我知道我“可以”,但我应该这样做吗?contains()
由于andintersects()
方法,我想扩展 Rectangle 类;我应该这样做还是应该为 Java 中的 2D 碰撞检测做其他事情?碰撞和矩形之间没有is-a
关系,碰撞不是矩形。冲突域可能有矩形,这表明您使用组合。
您可以轻松扩展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) { ... }
首先让它与 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++ 的类范围成员函数的“静态”修饰符?)。碰撞本身不是碰撞参与者的财产。