您的位置:首页 > 移动开发 > Cocos引擎

关于cocos2d中物理引擎碰撞掩码的设置

2017-03-19 11:14 363 查看
当物理引擎检测到两个Body发送的碰撞信息后,会调用相应的时间方法来通知系统,比如两个Body已经发生碰撞,两个Body已经分离。

接收碰撞事件的方法为onContactBegin;

接收分离事件的方法为onContactSeperate

一、碰撞掩码分为以下三种:

1.CategoryBitmask:该掩码会与另一个物体的另外两个掩码ContactTestBitmask、CollisionBitmask按位与,来确定是否可以碰撞

2.ContactTestBitmask:确定两个物体碰撞时是否调用onContactBegin

3.CollisionBitmask:确定两个物体是否允许碰撞

如果希望A和B允许碰撞,则

A的CategoryBitmask与B的CollisionBitmask与运算结果为0

B的CategoryBitmask与A的CollisionBitmask与运算结果为0

否则A和B就不允许碰撞,接触后直接弹开

如果希望A和B发生碰撞检测,即调用onContactBegin,则

A的CategoryBitmask与B的ContactTestBitmask与运算结果不为0

B的CategoryBitmask与A的ContactTestBitmask与运算结果不为0

三个掩码的默认值如下:

CategoryBitmask:UINT_MAX

ContactTestBitmask:UINT_MAX

CollisionBitmask:0

即默认情况下A和B既允许碰撞,也允许碰撞后调用onContactBegin

示例:

(1)导弹的掩码:

CategoryBitmask:0x01

ContactTestBitmask:0x03

CollisionBitmask:0x03

(2)飞船的掩码:

CategoryBitmask:0x01

ContactTestBitmask:0x03

CollisionBitmask:0x01

(3)七边形的掩码:

CategoryBitmask:0x01

ContactTestBitmask:0x02

CollisionBitmask:0x00

从中可以看出导弹与飞船之间不允许碰撞,导弹、飞船与分别与七边形接触允许碰撞。

同时导弹、飞船以及七边形只要碰撞都可以调用onContactBegin的方法

注:会遇到使用默认值无法调用onContactBegin的方法,解决办法是对每个body重新设置三个掩码就能解决

二、关于onContactBegin函数的返回值

1.当函数返回值为true时,则两个相撞的body会发生碰撞而弹开

2.当函数返回值为false时,则两个相撞的body会相互穿透对方,继续自己的运动
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: