Cocos2dx中关于setCategoryBitmask、setContactTestBitmask和setCollisionBitmask以及setGroup的正确含义

3 篇文章 0 订阅
1 篇文章 0 订阅

参考网址:http://www.benmutou.com/archives/920

 

Cocos2d-x版本:Cocos2dx-3.3beta0

 

关于如何设置监听碰撞事件请网上搜索或者参考以上网址,本文只是用我自己的理解理清这几个的区别和含义(因为网上都没有搜到,所以自己研究了一下),如有问题,欢迎批评指正。

 

setCategoryBitmask设置_categoryBitmask  类别标示掩码(一个世界最多32个,因为存储类型为int, 共32为,每个类别占用1个位)

setContactTestBitmask设置_contactTestBitmask 接触测试掩码

setCollisionBitmask设置_collisionBitmask 碰撞掩码

setGroup设置_group 组别

 

①   _collisionBitmask碰撞掩码,表示允许那些类别的物体来和自己发生碰撞,方法是用碰撞双方各自的碰撞掩码_collisionBitmask与对方的类别标示码_categoryBitmask做位与&运算,若都为非零,则发生碰撞,否则不碰撞。例如:

body1->setCategoryBitmask(1)  //(001)

body2->setCategoryBitmask(2)  //(010)

body3->setCategoryBitmask(4)  //(100)

 

body1-> setCollisionBitmask (6)  //(110)

body2-> setCollisionBitmask (5)  //(101)

body3-> setCollisionBitmask (2)  //(010)

 

结果:

body1与body2能碰撞,body1和body3不能碰撞,body2和body3能碰撞

分析:为什么body1和body3不能碰撞?

看body1的碰撞掩码000110,它分别与body2和body3的类别码做位与&运算后为非零,表示body1希望可以与body2和body3发生碰撞。再看body3的碰撞掩码000010,同理可知,body3不愿意接受body1的碰撞(只接受body1的碰撞),所以碰撞契约没有达成,不会产生碰撞。同理可知:body1与body2能碰撞,body2和body3能碰撞。


②   _contactTestBitmask接触测试掩码,表示哪些类别的物体“接触”时,会产生消息。这里的“接触”与第①点中的碰撞没有关联,①中的碰撞会实际上产生碰撞效果,而这里的接触只是一个测试碰撞,即如果①中没有发生碰撞,也可以在这里设置产生消息;反之,如果①中发生了碰撞,也可以不在这里产生消息。这完全根据自己游戏的需要来确定。它的方法同①一样,也是用接触双方各自的_contactTestBitmask 接触测试掩码与对方的类别标示码_categoryBitmask做位与&运算,若都为非零,则产生回调消息,否则产生消息(具体产生回调的消息,请参考http://www.benmutou.com/archives/920)。例子就不再列举,同以上一样,只是需要设置setContactTestBitmask,而不是setCollisionBitmask。


③   最后再说说setGroup,其实,网上都能搜到,看源代码也能知道,只是为了完整性,在此一并提一下。它的作用是:当两个对象的_group相等时,如果都为正,则必然碰撞,如果都为负,则必然不碰撞。如果两个对象的_group不相等,那么就需要根据①中的设置来处理了。也就是说:_group的优先级高于_collisionBitmask。


补充:使用时发现,如果两个物体的_group值同为负且相等时,_contactTestBitmask也无效。


关于碰撞检测参考 http://www.cocos2d-x.org/docs/manual/framework/native/wiki/physics/zh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值