更新于 

Collision 碰撞检测

2D碰撞组件

官方碰撞文档

cocos中提供3种2D碰撞检测组件:

  • Box Collider 方形盒检测器
  • Circle Collider 圆形检测器
  • Polygon Collider 多边形检测器

检测器属性:

  • Threshold 快速生成碰撞边界
  • Editing 开启可编辑
  • Tag 用于标记碰撞体类型
  • Offset 碰撞体偏移
  • Points 碰撞边界多边形顶点
碰撞回调函数

添加碰撞检测的组件,会多出3个碰撞回调函数:

  • onCollisionEnter(other, self) 碰撞发生时触发
  • onCollisionStay(other, self) 碰撞持续时触发
  • onCollisionExit(other, self) 碰撞结束时触发

回调函数的2个参数:

  • other 碰撞到的另一个物体:cc.Collider
  • self 碰撞者自己:cc.Collider
其它API

要想让碰撞检测生效,必须执行下面代码,表示碰撞管理器启用

1
cc.director.getCollisionManager().enabled = true;
  • CollisionManager.enabledDebugDraw
    • 是否绘制碰撞边界线
  • CollisionManager.enabledDrawBoundingBox
    • 是否绘制碰撞组件包围盒
碰撞检测实例

这里涉及到子弹Prefab的制作,
制作好子弹的预设体之后,
在发射子弹的主体Player的类中,添加新的可赋值属性:

1
2
@property(cc.Prefab)
bulletPre: cc.Prefab = null;

监听全局的键盘事件,
当空格被点击时,发送子弹:

  • cc.instantiate 创建预设体
1
2
3
const bullet = cc.instantiate(this.bulletPre)
bullet.setPosition(this.node.position)
bullet.setParent(this.node.getParent())

为Enemy对象添加碰撞回调:

1
2
3
4
5
6
7
8
onCollisionEnter(other: cc.Collider, self: cc.Collider){
// 判断碰撞物是否是子弹类型
if(other.tag == 3 ){
// 销毁子弹和自身
other.node.destroy()
self.node.destroy()
}
}

需要判断Player和收集目标的碰撞:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 碰撞发生时触发 */
onCollisionEnter(other: cc.Collider, self: cc.Collider) :void{
this.isCollision = true
switch(other.tag){
// 碰撞到草莓
case 5:
this.strawberry_value ++
this.strawberry_label.getComponent(cc.Label).string = this.strawberry_value.toString().padStart(2,'0')
other.node.destroy()
break;
// 碰撞到西瓜
case 6:
this.melon_value ++
this.melon_label.getComponent(cc.Label).string = this.melon_value.toString().padStart(2,'0')
other.node.destroy()
break;
default:break;
}
}