参考网址: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