Aur*_*bon 29
如果有人还在寻找更多解释,我在这里做了详细的教程:http:
//aurelienribon.wordpress.com/2011/07/01/box2d-tutorial-collision-filtering/

Mit*_*eat 15
来自Box2D 手册:
6.2.3.过滤
碰撞过滤是用于防止形状之间碰撞的系统.例如,假设您制作一个骑自行车的角色.您希望自行车与地形碰撞并且角色与地形碰撞,但您不希望角色与自行车碰撞(因为它们必须重叠).Box2D使用类别和组支持此类冲突过滤.
Box2D支持16种碰撞类别.对于每个形状,您可以指定它属于哪个类别.您还可以指定此形状可以与之碰撞的其他类别.例如,您可以在多人游戏中指定所有玩家不会相互碰撞,怪物不会相互碰撞,但玩家和怪物应该发生碰撞.这是通过屏蔽位完成的.例如:
Run Code Online (Sandbox Code Playgroud)playerShapeDef.filter.categoryBits = 0x0002; monsterShapeDef.filter.categoryBits = 0x0004; playerShape.filter.maskBits = 0x0004; monsterShapeDef.filter.maskBits = 0x0002;碰撞组允许您指定整数组索引.您可以使具有相同组索引的所有形状始终碰撞(正索引)或永不碰撞(负索引).组索引通常用于某种相关的事物,例如自行车的部件.在以下示例中,shape1和shape2始终发生碰撞,但shape3和shape4永远不会发生碰撞.
Run Code Online (Sandbox Code Playgroud)shape1Def.filter.groupIndex = 2; shape2Def.filter.groupIndex = 2; shape3Def.filter.groupIndex = -8; shape4Def.filter.groupIndex = -8;根据类别和掩码位过滤不同组索引的形状之间的冲突.换句话说,组过滤具有比类别过滤更高的优先级.
小智 11
这是我理解maskBits和categoryBits如何工作的方式.假设你有3个对象:objectA,objectB和objectC.
为每个对象定义一个类别:
objectA.categoryBits = 0x0002;
objectB.categoryBits = 0x0004;
objectC.categoryBits = 0x0008;
然后,设置maskBits,它定义每个categoryBits的冲突规则:
- > objectA与所有人冲突(0xFFFF)和(&)not(〜)objectB(0x0004)
objectA.maskBits = 0xFFFF&~0x0004;
- > objectB与objectA(0x0002)或(|)objectC(0x0008)冲突,但没有其他人
objectB.maskBits = 0x0002 | ×0008;
- > objectC与objectA(0x0002)冲突,但没有其他人
objectC.maskBits = 0x0002;
我不知道这是否正确,但它对我有用.
HTH