box2d fixture没有获得与其fixturedef相同的类别和掩码位

mbskvtky  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(271)

在我看来这很奇怪。我基于fixturedef创建装置。我使用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

什么?我的fixture的过滤位怎么可能与它们创建时使用的fixturedef不同呢?
我也发现了这一点:这些装置得到的面具是我在创建这些新装置之前销毁的身体面具。
不过,这不应该发生。
有人知道什么会导致这种行为吗?
编辑:
我发现在我的游戏中,每个人都会出现这种过滤器置乱现象。
我目前的工作是以下功能,这似乎足够了:

public static void fixFixtureFilter(Fixture fixture, short maskBits, short categoryBits) {
    Filter filter = fixture.getFilterData();
    filter.maskBits = maskBits;
    filter.categoryBits = categoryBits;
    fixture.setFilterData(filter);
}

不过,我的b2d世界肯定出了什么问题。

gcmastyq

gcmastyq1#

更新
似乎这个问题已经在这里得到了跟踪,并在新的1.9.13版本中得到了修复(请参阅发行说明)。所以这个问题可以通过将libgdx版本更新到1.9.13来解决。
我刚刚在我的项目中测试了这个,发现了和你描述的相同的行为。我正在设置 maskBits 我的 FixutreDef 但是当我创建 Body 和调试人员一起检查夹具 maskBitsFixture 设置为-1。所以这个虫子似乎是可以复制的。
但如果我改变了主意 maskBitsFixtureDef ,以避免特定类别的固定装置(我用敌人的固定装置进行了测试),它们确实不再与创建的固定装置冲突 Fixture (如果它真的有 maskBits 设置为-1,因为这意味着该装置会与其他所有对象发生碰撞)。
所以 maskBits libgdx中的fixture似乎是错误的,而 maskBits box2d中的一些fixture似乎是正确的,这是可能的,因为libgdx使用了一个java Package 器来 Package box2d,它是用本机方法实现的(我认为是用c实现的)。
因此,冲突检测正在工作,但是java Package 器显示了错误的值(可能是因为错误的引用,因为您说过“这些fixture得到的掩码是我在创建这些新fixture之前销毁的主体的掩码”)。
这个问题可能只是libgdx中的一个bug,这个bug很难找到,因为一开始一切似乎都正常(直到您调试它)。
您应该将这个bug添加到libgdx的问题跟踪器中,这样就可以修复它了。但不幸的是,这可能需要一段时间,所以您可能需要将工作区保留一段时间,或者忽略它,因为碰撞检测无论如何都是有效的。

相关问题