cocos2d x中碰撞检测类型及原理
碰撞检测原理概述
在游戏开发中,碰撞检测是一个重要的功能。其基本原理是,首先为每个游戏物体指定一个碰撞检测区域,然后在 Update
方法中实时检测两个物体的碰撞区域是否有重叠。若存在重叠,则判定这两个物体发生了碰撞。
示例代码及分析
以下是一段从官方代码中摘取的碰撞检测代码示例:
tools.CollisionHelper = {
IsCollided: function (ccA, ccB) {
var ax = ccA.x, ay = ccA.y, bx = ccB.x, by = ccB.y;
/*
if (Math.abs(ax - bx) > 5 || Math.abs(ay - by) > 5) {
return false;
}
*/
var aRect = this.MakeCollideRect(ccA);
var bRect = this.MakeCollideRect(ccB);
return cc.rectIntersectsRect(aRect, bRect);
},
MakeCollideRect: function (ccA) {
return cc.rect(ccA.x - 3, ccA.y - 3, 20, 20);
}
};
代码解释
IsCollided
函数:该函数用于判断两个游戏物体ccA
和ccB
是否发生碰撞。首先获取两个物体的坐标,注释部分的代码是一个简单的初步判断,如果两个物体在x
或y
方向上的距离超过 5 个单位,就直接判定不会发生碰撞,可提高性能。接着调用MakeCollideRect
函数分别为两个物体创建碰撞区域矩形,最后使用cc.rectIntersectsRect
函数判断这两个矩形是否相交,若相交则返回true
,表示发生碰撞,否则返回false
。MakeCollideRect
函数:该函数用于为指定的游戏物体ccA
创建碰撞区域矩形。这里设定碰撞区域的高和宽都是 20 个单位,矩形的左上角坐标为当前游戏物体坐标减去 3。需要注意的是,这个 3 的值必须根据游戏中不同物体的实际情况进行动态调节。
实际上,cc.rectIntersectsRect
函数内部也是进行区域范围检测,通过比较两个矩形的边界来判断是否相交。
碰撞后的处理
隐藏游戏物体
当检测到两个游戏物体发生碰撞后,如果需要隐藏其中一个游戏物体,可以直接使用 gameObject.setVisibility(false)
方法。
实现碰撞动画
利用碰撞检测结果,配合 cc.fadeIn
和 cc.fadeOut
函数,可以很方便地实现碰撞动画。例如,当检测到碰撞发生时,让物体逐渐消失(使用 cc.fadeOut
),或者逐渐出现(使用 cc.fadeIn
)。