我正在使用java.awt
创建游戏,并且想知道如何对Area
进行高级碰撞检测。在我的游戏中,每个实体都有一个用Area
制成的对撞机。通过高级碰撞检测,我的意思是我不想两个区域之间的碰撞导致实体停止,而是希望碰撞导致实体滑过。实体具有double
的大小和方向值以及它们的碰撞形状的“面积”。碰撞形状应该可以是任何形状(不仅是矩形或圆形)。程序的输出应该是一个向量,当与实体结合使用时,可能会导致该实体不发生碰撞。
// Basic collision without sliding
public static boolean testCollsion(Area a, Area b) {
Area c = (Area) a.clone();
c.intersect(b);
return !c.isEmpty();
}
// Advanced sliding collision
// Where b is stationary and a should change
public static void collide(Collidable a, Collidable b) {
Area areaA = new Area(a.getCollider().shape);
Area areaB = new Area(b.getCollider().shape);
Area c = (Area) areaA.clone();
c.intersect(areaB);
if (!c.isEmpty()) {
double directionA = a.getDirection();
double directionB = b.getDirection();
double magnitudeA = a.getMagnitude();
double magnitudeB = b.getMagnitude();
// Calculate collision vector
double directionC = ?;
double magnitudeC = ?;
}
}
碰撞后,应将实体移出它所撞击的物体的区域,同时保留其速度和方向,并使其在该区域内滑动。应该用另一个矢量来完成,以抵消实体向碰撞的移动。