游戏之碰撞检测

JAVA游戏之碰撞检测

碰撞检测的过程处理主要有以下三步:

  1. 碰撞检测(Collision Detection):返回两个或多个物体是否发生碰撞的布尔判断。
  2. 碰撞确定(Collision Determination):找到物体之间实际相交位置。
  3. 碰撞响应(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 + ",未碰撞");
}

    原文作者:闲闲居士
    原文地址: https://blog.csdn.net/weixin_43414320/article/details/90048863
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞