我已经阅读了 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
并且玩家总是与触发对象发生碰撞。如何让玩家和障碍物永远不会与触发对象发生碰撞?