cocos creator 碰撞检测系统collider

Cocos Creator提供了一套内置的简单碰撞检测系统,通过添加矩形、圆形和多边形碰撞组件来实现碰撞检测。当碰撞发生时,系统会通过回调函数通知开发者,包括碰撞开始、持续和结束的回调。这在游戏场景中,如子弹击中敌人等,非常实用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cocos creator 内置了简单的碰撞检测系统,会根据当前节点下添加的碰撞组件进行碰撞检测。它可以应用在很多场景,比如可以用来判断子弹是否碰撞到敌人。

碰撞组件

矩形碰撞组件:
在这里插入图片描述
圆形碰撞组件:
在这里插入图片描述
多边形碰撞组件:
在这里插入图片描述

属性作用
Editing选中之后,可以在场景编辑器中对碰撞组件进行编辑
Tag如果节点下挂有多个碰撞组件时,可以根据标签来区分各个碰撞组件
Offset组件相对于所挂节点的偏移
Size矩形碰撞组件的大小
Radius圆形碰撞组件的半径
Points多边形碰撞组件各个顶点的坐标

碰撞系统接口

cc.director.getCollisionManager().enabled = true; //开启碰撞检测,默认为关闭
cc.director.getCollisionManager().enabledDebugDraw = true; //开启碰撞检测范围的绘制
cc.director.getCollisionManager().enabledDrawBoundingBox = true; //开启碰撞组件的包围盒绘制

碰撞系统回调

当碰撞系统检测到有碰撞产生时,将会以回调的方式通知使用者,如果产生碰撞的碰撞组件依附的节点下挂的脚本中有实现以下函数,则会自动调用以下函数,
碰撞产生时调用:

onCollisionEnter: function(other,self){
	//self代表当前节点的的碰撞组件,other代表和self产生碰撞的其他碰撞组件
	var world = self.word; //碰撞组件在世界坐标系下的相关值都放在world这个属性里面
	cc.log(world);
}

碰撞产生后,未结束前,每次碰撞计算后调用:

onCollisionStay: function(other,self){

}

碰撞结束后调用:

onCollisionExit: function(other,self){

}

world中的属性
矩形碰撞组件:
在这里插入图片描述
圆形碰撞组件:
在这里插入图片描述
多边形碰撞组件:
在这里插入图片描述

属性解释
world.aabb代表碰撞组件的aabb框,即碰撞产生时,碰撞组件的矩形框,是一个Rect
world.preAabb代表碰撞前上一帧的aabb框
world.matrix代表碰撞框的世界矩阵
world.position代表碰撞时碰撞框的位置坐标(圆形碰撞组件特有)
world.radius代表碰撞时碰撞框的半径(圆形碰撞组件特有)
world.points代表碰撞时碰撞框的所有顶点坐标(矩形和多边形碰撞组件特有)
CocosCreator实现的 解救人质 游戏,学会碰撞检测rescue.7z // Bullet.js cc.Class({ extends: cc.Component, properties: { mSpeed: 300, }, // LIFE-CYCLE CALLBACKS: // onLoad () {}, start() { var manager = cc.director.getCollisionManager(); // 获取碰撞检测系统 manager.enabled = true; }, update(dt) { // 设置子弹移动,当超出屏幕范围未发生碰撞时自动销毁 this.node.y += this.mSpeed * dt; if (this.node.y > 580) { console.log('超出屏幕范围,子弹销毁!'); this.node.destroy(); } }, /** * 当碰撞产生的时候调用 * @param {Collider} other 产生碰撞的另一个碰撞组件 * @param {Collider} self 产生碰撞的自身的碰撞组件 */ onCollisionEnter: function (other, self) { console.log('on collision enter'); if (other.tag == 1) { // 子弹碰到人质时,解救失败! console.log('解救人质失败!'); var failLabel = this.node.parent.getChildByName('failLabel'); failLabel.active = true; this.node.destroy(); } else if (other.tag == 2) { // 子弹碰到敌人时,解救成功! console.log('解救人质成功!'); var successLabel = this.node.parent.getChildByName('successLabel'); successLabel.active = true; this.node.destroy(); } }, /** * 当碰撞产生后,碰撞结束前的情况下,每次计算碰撞结果后调用 * @param {Collider} other 产生碰撞的另一个碰撞组件 * @param {Collider} self 产生碰撞的自身的碰撞组件 */ onCollisionStay: function (other, self) { console.log('on collision stay'); }, /** * 当碰撞结束后调用 * @param {Collider} other 产生碰撞的另一个碰撞组件 * @param {Collider} self 产生碰撞的自身的碰撞组件 */ onCollisionExit: function (other, self) { console.log('on collision exit'); } });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值