java - Box2D Fixture 没有得到与其 FixtureDef 相同的类别和掩码位
问题描述
在我看来,这很奇怪。我基于fixtureDef 创建了fixture。我使用 Box2D 的 libGDX 版本。这是我的代码:
System.out.println("category bits of fixtureDef: " + fixtureDef.filter.categoryBits);
System.out.println("mask bits of fixtureDef: " + fixtureDef.filter.maskBits);
System.out.println("category bits of fixtureDef: " + fixtureDef_leftPropeller.filter.categoryBits);
System.out.println("mask bits of fixtureDef: " + fixtureDef_leftPropeller.filter.maskBits);
System.out.println("category bits of fixtureDef: " + fixtureDef_rightPropeller.filter.categoryBits);
System.out.println("mask bits of fixtureDef: " + fixtureDef_rightPropeller.filter.maskBits);
Body body = world.createBody(Res.bodyDef_dynamic);
fixture = body.createFixture(fixtureDef);
fixture_leftPropeller = body.createFixture(fixtureDef_leftPropeller);
fixture_rightPropeller = body.createFixture(fixtureDef_rightPropeller);
body.setTransform(pos.x * Drone2D.MPP, pos.y * Drone2D.MPP, 0);
body.setUserData(drone);
System.out.println(" ");
for (Fixture fix : body.getFixtureList()) {
System.out.println("category bits of fixture: " + fix.getFilterData().categoryBits);
System.out.println("mask bits of fixture: " + fix.getFilterData().maskBits);
}
这段代码的输出是:
category bits of fixtureDef: 2
mask bits of fixtureDef: 11
category bits of fixtureDef: 2
mask bits of fixtureDef: 11
category bits of fixtureDef: 2
mask bits of fixtureDef: 11
category bits of fixture: 4
mask bits of fixture: -1
category bits of fixture: 4
mask bits of fixture: -1
category bits of fixture: 4
mask bits of fixture: -1
什么?我的夹具的过滤位如何与创建它们的夹具Def 不同?
我也发现了这一点:这些固定装置获得的面具是我在创建这些新固定装置之前破坏的身体面具。
不过,这不应该发生。
有谁知道什么会导致这种行为?
编辑:
我发现这种过滤器加扰现象发生在我游戏中的每一个身体上。
我目前的工作是以下功能,这似乎就足够了:
public static void fixFixtureFilter(Fixture fixture, short maskBits, short categoryBits) {
Filter filter = fixture.getFilterData();
filter.maskBits = maskBits;
filter.categoryBits = categoryBits;
fixture.setFilterData(filter);
}
不过,我的 B2D 世界一定有什么问题。
解决方案
更新
似乎此问题已在此处跟踪并已在新的 1.9.13 版本中修复(请参阅发行说明。因此,可以通过将 libGDX 版本更新到 1.9.13 来修复此问题。
我刚刚在我的项目中对此进行了测试,发现与您描述的行为相同。我将maskBits
my设置FixutreDef
为9,但是当我创建Body
并使用调试器检查固定装置时,maskBits
设置Fixture
为-1。所以这个错误似乎是可以重现的。
但是,如果我更改maskBits
,FixtureDef
以避免特定类别的固定装置(我用敌人固定装置测试它),它们确实不再与创建的装置发生冲突(如果它真的设置为-1Fixture
是不可能的,因为那将意味着夹具与所有其他对象发生碰撞)。maskBits
所以libGDXmaskBits
中的固定装置似乎是错误的,而Box2D中的固定装置似乎是正确的,这是可能的,因为 libGDX 使用 Box2D 的 java 包装器,它是在本机方法中实现的(在 CI 中认为)。maskBits
因此,碰撞检测工作正常,但 java 包装器显示错误的值(可能是因为引用错误,因为您说“这些固定装置获得的掩码是我在创建这些新固定装置之前销毁的主体的掩码”)。
这个问题可能只是libGDX 中的一个错误,这很难找到,因为一开始一切似乎都在工作(直到你调试它)。
您应该将此错误添加到 libGDX 的问题跟踪器中,以便可以修复它。但不幸的是,这可能需要一些时间,因此您可能需要保留一段时间,或者忽略它,因为无论如何碰撞检测都在工作。
推荐阅读
- python - 如何将列表列表从 Python 中的类对象输出转换为平面列表而不会出现错误“'用户'对象不可迭代”
- python - PyInstaller 图标选项在 Mac 上不起作用
- oracle - 从 {"key1":value1,"key2":value2, } 等列中选择值?
- xml - 如何在 mulesoft 的 dwl 2.0 中的 xml 标头标记中定义多个命名空间?
- java - 选择使用 NVL 书写的信件。为什么?
- sql-server - 如何以正确的方式将非空参数声明到 Store 过程中?
- reactjs - Firebase set() 承诺第二次卡住“createUserWithEmailAndPassword”
- php - 升级 Google Drive API 范围时如何重新认证
- python - 如何使用 SQLAlchemy 在烧瓶中保持平均功能?
- dart - 有没有办法在 Dart 中获得类似于 Swift 的 List.enumerated() 方法的功能?