JAVA游戏之碰撞检测
碰撞检测的过程处理主要有以下三步:
- 碰撞检测(Collision Detection):返回两个或多个物体是否发生碰撞的布尔判断。
- 碰撞确定(Collision Determination):找到物体之间实际相交位置。
- 碰撞响应(Collision Response):针对两个物体之间的碰撞决定采取何种操作。
矩形碰撞检测
- 游戏中的物体形状一般为矩形,这是规则图形。它的碰撞检测可以通过Java API中的Rectangle类来实现碰撞的检测。
Rectangle 指定坐标空间中的一个区域,通过坐标空间中 Rectangle 对象左上方的点 (x,y)、宽度和高度可以定义这个区域。 - 其构造函数Rectangle(int x, int y, int width, int height)
- height Rectangle 对象的高度。
- width Rectangle 对象的宽度。
- x Rectangle 对象左上角的 X 坐标。
- y Rectangle 对象左上角的 Y 坐标。
碰撞检测相关的方法:
// 计算此 Rectangle 与指定 Rectangle 的交集
public Rectangle intersection(Rectangle r)
// 确定此 Rectangle 是否与指定的 Rectangle 相交
public Rectangle intersects(Rectangle r)
如果两个Rectangle对象有交集,那么他们就有碰撞了
适用于在精确度要求不高时的碰撞检测
eg.
boolean crash = false;
//两者的矩形范围
Rectangle tank1 = new Rectangle(x,y,20,80);
Rectangle tank2 = new Rectangle(x1,y1,50,80);
//判断两个矩形是否有交集,crash 为 true 说明碰撞了
crash = tank1.intersects(tank2);
圆形碰撞检测
圆形检测与矩形检测类似,区别在于用一个能够包含物体的圆代替了矩形。主要是考虑到游戏中的物体外形以平滑为主,例如人物角色。而判断两个圆是否碰撞的计算也很简单,就是判断两个圆心之间的距离是否小于两个圆的半径之和。
eg.
/* 判断两圆是否相交 */
// 两圆中心坐标
int centerX1 = x1 + r1, centerY1 = y1 + r1;
int centerX2 = x2 + r2, centerY2 = y2 + r2;
// 求两圆的圆心距
double length = Math.sqrt(Math.pow(centerX1 - centerX2, 2)+ Math.pow(centerY1 - centerY2, 2));
// 判断圆心距与两圆半径和的关系
if (length < (r1 + r2)) {
JOptionPane.showMessageDialog(null, "圆心距:" + length + ",碰撞了");
} else {
JOptionPane.showMessageDialog(null, "圆心距:" + length + ",未碰撞");
}