cocos2d x中碰撞检测类型及原理

2015年02月12日 10:52 0 点赞 0 评论 更新于 2017-04-27 17:06

碰撞检测原理概述

在游戏开发中,碰撞检测是一个重要的功能。其基本原理是,首先为每个游戏物体指定一个碰撞检测区域,然后在 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 函数:该函数用于判断两个游戏物体 ccAccB 是否发生碰撞。首先获取两个物体的坐标,注释部分的代码是一个简单的初步判断,如果两个物体在 xy 方向上的距离超过 5 个单位,就直接判定不会发生碰撞,可提高性能。接着调用 MakeCollideRect 函数分别为两个物体创建碰撞区域矩形,最后使用 cc.rectIntersectsRect 函数判断这两个矩形是否相交,若相交则返回 true,表示发生碰撞,否则返回 false
  • MakeCollideRect 函数:该函数用于为指定的游戏物体 ccA 创建碰撞区域矩形。这里设定碰撞区域的高和宽都是 20 个单位,矩形的左上角坐标为当前游戏物体坐标减去 3。需要注意的是,这个 3 的值必须根据游戏中不同物体的实际情况进行动态调节。

实际上,cc.rectIntersectsRect 函数内部也是进行区域范围检测,通过比较两个矩形的边界来判断是否相交。

碰撞后的处理

隐藏游戏物体

当检测到两个游戏物体发生碰撞后,如果需要隐藏其中一个游戏物体,可以直接使用 gameObject.setVisibility(false) 方法。

实现碰撞动画

利用碰撞检测结果,配合 cc.fadeIncc.fadeOut 函数,可以很方便地实现碰撞动画。例如,当检测到碰撞发生时,让物体逐渐消失(使用 cc.fadeOut),或者逐渐出现(使用 cc.fadeIn)。

作者信息

boke

boke

共发布了 1025 篇文章