游戏中的碰撞(一)

对于一个游戏对象来说,有他自己的精灵和碰撞盒,一般来说,碰撞盒有矩形,圆形和精确型,当然你也可以任性的把一个碰撞盒做成不规则的。

那么根据这些碰撞盒,就产生了多种碰撞方式,例如:矩形与矩形,矩形与圆形,矩形与精确型,矩形与不规则型的,圆形精确型的......

碰撞方式是如此之多,但是,因为效率和代码复杂度的问题,我们一般不采用精确碰撞,除非你用到的时候。

本篇首先研究矩形与矩形,圆形与圆形的碰撞:

(一)矩形与矩形的碰撞:

例如图中的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;
}



 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值