微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Box2D Fixture 没有获得与其 FixtureDef 相同的类别和掩码位

如何解决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

什么?我的设备的过滤位怎么可能与创建它们时使用的设备定义不同?

我也发现了这一点:这些装置获得的面具是我在创建这些新装置之前破坏的身体的面具。

不过,这不应该发生。

有人知道是什么导致了这种行为吗?

编辑:

我发现这种过滤器扰乱现象发生在我游戏中的每个身体上。

我目前的工作是以下功能,这似乎就足够了:

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

不过,我的 B2D 世界肯定出了点问题。

解决方法

更新

这个问题似乎已经被跟踪到 here 并且已经在新的 1.9.13 版本中修复了(参见 release notes。所以这个问题可以通过 updating your libGDX version 修复到 1.9 .13.


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

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

所以 libGDX 中灯具的 maskBits 似乎错误,而 Box2D 中灯具的 maskBits 似乎正确,这可能是可能的,因为 libGDX 使用了 Box2D 的 java 包装器,该包装器是在本机方法中实现的(在 CI 中)。

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


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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。