对于一个游戏对象来说,有他自己的精灵和碰撞盒,一般来说,碰撞盒有矩形,圆形和精确型,当然你也可以任性的把一个碰撞盒做成不规则的。
那么根据这些碰撞盒,就产生了多种碰撞方式,例如:矩形与矩形,矩形与圆形,矩形与精确型,矩形与不规则型的,圆形精确型的......
碰撞方式是如此之多,但是,因为效率和代码复杂度的问题,我们一般不采用精确碰撞,除非你用到的时候。
本篇首先研究矩形与矩形,圆形与圆形的碰撞:
(一)矩形与矩形的碰撞:
例如图中的2个矩形,如果判断他们2个是否碰撞,确实有点不好想,不过,我们可以反过来考虑他们2个不撞得情况,那么就会有4种情况。
除了这4种不碰撞的情况,剩下的都是碰撞的情况.假设矩形1的左上角的坐标为(x1,y1),横向宽度为w1,纵向高度为h1,矩形2的左上角坐标为(x2,y2),横向宽度为w2,纵向高度为h2.同android,windows的屏幕坐标系统一样,我们假设左上角为原点(0,0),横向向右为x轴正向,纵向为y轴正向。
那么对于情况1:我们可以得到判定条件为x1+w1<x2
情况2:我们可以得到判定条件为x1>x2+w2
情况3:我们可以得到判定条件为y1+h1<y2
情况4:我们可以得到判定条件为y1>y2+h2
除了这4种情况外的都为碰撞,因此我们可以写出函数代码:
<span style="font-size:12px;color:#000000;">bool collision(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2)
{
if(x1+w1<x2)
return false;
else if(x1>x2+w2)
return false;
else if(y1+h1<y2)
return false;
else if(y1>y2+h2)
return false;
return true;
}</span>
(二)圆形与圆形的碰撞:
如果要判断2个圆之间是否碰撞,只需要判断2个圆的圆心距是否小于2圆的半径之和,如果是,那么这2圆发生了碰撞事件,我们假设圆形1的圆心坐标是x1,y1,半径是r1,圆形2的圆形坐标是x2,y2,半径是r2.坐标系统依旧延续刚才矩形的坐标系统.
那么我们可以得出,sqrt(pow(x1-x2,2)+pow(y1-y2),2)<=r1+r2,那么这2个圆就发生了碰撞.不过考虑到开平方的代价,我们可以稍作改变,比较他们的平方就可以了.
因此我们可以写出代码:
bool collision(int x1,int y1,int r1,int x2,int y2,int r2)
{
if(pow(x1-x2,2)+pow(y1-y2,2)<=pow(r1+r2,2))
return true;
return false;
}