一、碰撞检测
解题思路:可以通过比较两个对象间的距离和两个对象半径和的大小。如果它们之间的距离小于半径之和,就说明产生了碰撞。
为了得到半径,可以取高度或者宽度的一半作为半径的值。
解析图如下:
代码如下:
public boolean isColliding(int ax, int ay, int aw, int ah, int bx, int by, int bw, int bh) {
int ar = aw / 2, br = bw / 2;// 两个圆的半径
int acx = ax + ar, acy = ay + ar;// 圆形a的圆心坐标
int bcx = bx + br, bcy = by + br;// 圆形b的圆心坐标
// 求圆心距
double length = Math.sqrt(Math.pow(acx - bcx, 2) + Math.pow(acy - bcy, 2));
// 判断圆心距与两圆半径和的关系并返回,true代表两圆发生碰撞
return length < (ar + br);
}
二、像素碰撞
由于游戏中的角色的大小往往是以一个刚好能够将其包围的矩形区域来表示的,如图所示,虽然两个卡通人物并没有发生真正的碰撞,但是矩形碰撞检查的结果却是发生了碰撞。
如果使用像素检查,首先需要遍历算出一张图所有的像素点坐标,然后与另外一张图上的所有点坐标进行对比,一旦有一个像素点的坐标相同,就立刻取出这两个坐标相同的像素点,通过位运算取出这两个像素点的最高位(透明度)进行对比,如果两个像素点都是非透明像素则判定这两张位图发生碰撞。至此像素碰撞比之前的碰撞检查都要精确,但缺点就是计算复杂,消耗了大量的系统资源,因此一般没有特殊要求,像素检查在游戏开发中是尽量避免使用,大多数情况下建议使用矩形检查碰撞。
三、总结
矩形碰撞 原理: 两个矩形位置的四种情况,若不是这四中情况则发生碰撞。
圆形碰撞 原理: 利用两个圆心之间的距离进行判定.当两个圆心的距离小于半径之和则碰撞.。
像素碰撞 原理: 遍历所有像素,不适用
以上只是总结了几种简单的方法,在Java中掌握这几种方法就可以了,它不需要太精密的算法,当然有时候情况会更复杂,例如一个对象运动速度足够快,可能只经历一步就穿越了一个本该和它发生碰撞的对象,这种情况就需要根据它的运动路径来处理。还有可能碰到不同边界发生不同行为的情况,这就要对碰撞行为进行具体分析再处理。