首页 > 解决方案 > 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 世界一定有什么问题。

标签: javalibgdxbox2d

解决方案


更新

似乎此问题已在此处跟踪并已在新的 1.9.13 版本中修复(请参阅发行说明。因此,可以通过将 libGDX 版本更新到 1.9.13 来修复此问题。


我刚刚在我的项目中对此进行了测试,发现与您描述的行为相同。我将maskBitsmy设置FixutreDef9,但是当我创建Body并使用调试器检查固定装置时,maskBits设置Fixture-1。所以这个错误似乎是可以重现的。

但是,如果我更改maskBits,FixtureDef以避免特定类别的固定装置(我用敌人固定装置测试它),它们确实不再与创建的装置发生冲突(如果它真的设置为-1Fixture是不可能的,因为那将意味着夹具与所有其他对象发生碰撞)。maskBits

所以libGDXmaskBits中的固定装置似乎是错误的,而Box2D中的固定装置似乎是正确的,这是可能的,因为 libGDX 使用 Box2D 的 java 包装器,它是在本机方法中实现的(在 CI 中认为)。maskBits

因此,碰撞检测工作正常,但 java 包装器显示错误的值(可能是因为引用错误,因为您说“这些固定装置获得的掩码是我在创建这些新固定装置之前销毁的主体的掩码”)。
这个问题可能只是libGDX 中的一个错误,这很难找到,因为一开始一切似乎都在工作(直到你调试它)。


您应该将此错误添加到 libGDX 的问题跟踪器中,以便可以修复它。但不幸的是,这可能需要一些时间,因此您可能需要保留一段时间,或者忽略它,因为无论如何碰撞检测都在工作。


推荐阅读