JBox2D碰撞过滤(categoryBits,maskBits)

时间:2011-05-13 14:16:38

标签: android box2d jbox2d

我已经阅读了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

播放器始终与触发器对象发生碰撞。如何让玩家和障碍物从不与触发器对象发生碰撞?

0 个答案:

没有答案