我已经阅读了Box2D手册,并且我理解了屏蔽是如何工作的。但是我得到的结果并没有遵循手册中的内容。
我有三类东西:玩家,障碍物和触发器。
球员和障碍相互碰撞但不与自己发生碰撞。我通过设置来实现这一点:播放器
circleDef.filter.categoryBits = 0x2;
circleDef.filter.maskBits = 0x4;
障碍
shapeDef.filter.categoryBits = 0x4;
shapeDef.filter.maskBits = 0x2;
我想也有触发类型......这些我只是用来检测播放器并触发事件但不应该碰到任何东西。逻辑上,应该可以通过将maskBits设置为0x0来实现。 JBox2D冲突代码如下。
DefaultContactFilter.java
boolean collide = (filter1.maskBits & filter2.categoryBits) != 0 && (filter1.categoryBits & filter2.maskBits) != 0;
return collide;
因此,如果maskBits = 0,则碰撞永远不会返回true。我将类别位设置为下一个自由类别 - 0x8。
触发
shapeDef.filter.categoryBits = 0x8;
shapeDef.filter.maskBits = 0x0;
我认为这可能与Java的整数工作方式有所不同,但我测试并发现了以下结果:
0x2 & 0x2 = 2
0x2 & 0x0 = 0
触发器用于触发事件。这是通过实现CollisionListener并使用触发器测试播放器冲突然后设置布尔标志来完成的。但是,当我运行模拟时,玩家正在与触发器发生碰撞,障碍也是如此。
我也尝试将类别和掩码位设置为以下各自的值:
0x0 0x0
0x8 0x8
0x2 0x4
0x4 0x2
播放器始终与触发器对象发生碰撞。如何让玩家和障碍物从不与触发器对象发生碰撞?