1

我已经阅读了 Box2D 手册,并且我了解掩蔽通常是如何工作的。但是我得到的结果并没有遵循手册中的规定。

我有 3 类事物:玩家、障碍物和触发器。

玩家和障碍物会相互碰撞,但不会与自身发生碰撞。我通过设置来完成这个工作:

播放器

 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,那么 collide永远不应该返回 true。我将类别位设置为下一个免费类别 - 0x8。

扳机

shapeDef.filter.categoryBits = 0x8;
shapeDef.filter.maskBits = 0x0;

我认为这可能与 Java 的 int 工作方式与我的预期不同有关,但我测试并发现了以下结果:

0x2 & 0x2 = 2
0x2 & 0x0 = 0

触发器旨在用于触发事件。这是通过实现 CollisionListener 并测试玩家与触发器的碰撞然后设置布尔标志来完成的。但是,当我运行模拟时,玩家正在与触发器发生碰撞,障碍物也是如此。

我还尝试将类别和掩码位设置为以下各自的值:

0x0 0x0
0x8 0x8
0x2 0x4
0x4 0x2

并且玩家总是与触发对象发生碰撞。如何让玩家和障碍物永远不会与触发对象发生碰撞?

4

0 回答 0