【Cocos2d-x 3.3】22:碰撞检测3_物理引擎碰撞过滤cheyiliu2015-02-11 12:09:441870 次阅读 引子 上一篇《【Cocos2d-x 3.3】碰撞检测2:物理引擎初探》简单演示了如何使用物理引擎以及用它来作碰撞监测。但有问题,那就是敌人和敌人也会发生碰撞,子弹和子弹之间也会发生碰撞。要解决这个问题(避免不必要的碰撞,或碰撞过滤),得先看看Cocos2d-x封装物理引擎后给我们提供的API。 PhysicsBody相关API说明
PhysicsBody的Group 1.优先级比bit masks的优先级高(CategoryBitmask,ContactTestBitmask,CollisionBitmask) 2.group是正数且相等的话,就一定碰撞 3.group是负数且相等的话,就一定不会碰撞 4.group其他情况没说,应该是取决于bit masks了
PhysicsBody的CategoryBitmask 1.CategoryBitmask用来标记这个PhysicsBody的所属类别 2.每个PhysicsBody最多可以属于32个类别,一个bit代表一个类别,0代表不是对应类别,1代表是对应类别 3.和另外两个属性(collisionBitMask and contactTestBitMask)配合着用 4.默认值0xFFFFFFFF,即这个PhysicsBody分别属于所有的32个类别
PhysicsBody的ContactTestBitmask 1.ContactTestBitmask用来定义哪个类别的PhysicsBody可以和这个PhysicsBody产生相交通知 2.举个例子:有PhysicsBody A B占了同样的空间了。如何判断A B要产生相交通知呢, if((A.CategoryBitmask & B.ContactTestBitmask) != 0 || (A.ContactTestBitmask & B.CategoryBitmask) != 0) {/*条件成立,执行相交通知*/} else{/*没有相交通知*/} 3.为了性能考虑,相交通知只应该设置给我们感兴趣的物体 4.默认值0x00000000 (all bits cleared),没有哪个类别的PhysicsBody可以产生相交通知
PhysicsBody的CollisionBitmask 1.CollisionBitmask是用来定义哪个类别的PhysicsBody可以和这个PhysicsBody产生碰撞 2.举个例子:有PhysicsBody A B彼此接触了,那碰撞就可能发生。 A受不受这个碰撞的影响(体现为物理效果)表达为:
3.至于B受不受这个碰撞的影响,则采用同样的表达式单独计算即可
4.默认值0xFFFFFFFF (all bits set),所有类别的PhysicsBody都能对this body产生碰撞效果 DEMO及源码
验证对API的理解 所有参数保持默认
group = 0 CategoryBitmask = 0xFFFFFFFF ContactTestBitmask = 0x00000000 CollisionBitmask = 0xFFFFFFFF
确认group优先级
group = 需要设置<----- CategoryBitmask = 0xFFFFFFFF ContactTestBitmask = 0x00000000 CollisionBitmask = 0xFFFFFFFF
想要回调
group = 0 CategoryBitmask = 0xFFFFFFFF ContactTestBitmask = 0x00000001<-----change to this CollisionBitmask = 0xFFFFFFFF
想要回调但不要碰撞效果
group = 0 CategoryBitmask = 0xFFFFFFFF ContactTestBitmask = 0x00000001<-----change to this CollisionBitmask = 0x00000000<-----change to this
想要A类和B类碰撞,A类之间不碰撞,B类之间不碰撞-法1
group = 0【A的group取-1;B的group取-2】 CategoryBitmask = 0xFFFFFFFF ContactTestBitmask = 0xFFFFFFFF【AB都取这个值】 CollisionBitmask = 0xFFFFFFFF
想要A类和B类碰撞,A类之间不碰撞,B类之间不碰撞-法2
group = 0【AB都保持默认0】 CategoryBitmask = 【A的CategoryBitmask=0x01;B的CategoryBitmask=0x02】 ContactTestBitmask = 【A的ContactTestBitmask=0x02;B的ContactTestBitmask=0x01】 CollisionBitmask = 【A的CollisionBitmask=0x02;B的CollisionBitmask=0x01】
效果图 想要A类和B类碰撞,A类之间不碰撞,B类之间不碰撞(NOTE: gif中,相同的图片是同一类,不同图片类型不同) 总结
|
|
来自: 笔记小窝 > 《cocos2dx-c 》