【问题标题】:contact listener for box2d not working properly联系 box2d 的监听器无法正常工作
【发布时间】:2015-06-07 18:45:28
【问题描述】:

我有两个身体。一个圆圈里面有一个球,一只鸟有一个多边形。我正在尝试检测身体内的精灵之间的碰撞,而不是身体本身,如下面的代码 sn-p 所示。

 @Override
 public void beginContact(Contact contact) {
Body a = contact.getFixtureA().getBody();
Body b = contact.getFixtureB().getBody();

if(contact.isTouching()){ 
    System.out.println(contact.isTouching());
    if (a.getUserData() == Constants.Enemy || b.getUserData() == Constants.Enemy) {
        System.out.println("yes");
    } 
  }
}

当身体处于下图所示的舞台时,上面的方法打印出“是”,这是不正确的,因为精灵没有相互接触。有什么想法吗?

【问题讨论】:

  • 如果鸟的形状是绘制的矩形,那么身体确实接触到了。你必须为鸟选择一个更合适的身体,而不是不必要的大矩形,也许是多边形。
  • 您正在检查身体碰撞时的碰撞,或者您是否必须检查精灵碰撞。如果身体发生碰撞,则检查精灵是否也发生碰撞

标签: libgdx box2d


【解决方案1】:

可能还有另一种方法,但如果我想要更准确,会使用这个工具 -> http://www.aurelienribon.com/blog/projects/physics-body-editor/

如果您遇到任何初始错误,您可以查看这些问题,可能是充电器错误 -> Physics Body Editor error

或者这个BodyEditorLoader - noSuchMethod在这个回复中,公开使用在libgdx(1.5.x)中对我有用的充电器

希望能帮到你

更新:

你说:谢谢你,但我不确定这对我的情况是否有帮助。

Box2d 最初假设它对你的精灵、位置或任何东西一无所知。他“box2d”只知道固定装置等。如果您的精灵与夹具的大小不匹配,不知道,不是故障,但您期望有所不同。

所以使用该工具,我说过,您可以将夹具更友好地调整为精灵的形状。

这是一个尽可能模拟的图像,夹具是 Gimp 中的图像,只是为了看看这个想法:

【讨论】:

  • 感谢您,但我不确定这是否对我有帮助。基本上,我想在球击中它时摧毁鸟,所以我想知道我是否可以编写一个基于 delta 的延迟方法,在开始接触后 x 毫秒内摧毁鸟?怎么能做到这一点?谢谢
  • @george 我不是以英语为母语的人,但我认为您的部分评论与您最初提出的问题不同,或者在我看来是这样
  • 我明白你对物理体编辑器的意思,并且喜欢这个想法,但我所说的精灵是一个动画精灵 - 一只翅膀会动的飞鸟。而且编辑器只与刚体有关,所以我不确定我能否将它用于动画精灵
【解决方案2】:

就像天使天使说的,

Box2D 有边界体积来检测碰撞,这些碰撞不是像素完美的,而且对 Sprite 本身一无所知。这是出于性能考虑,因为碰撞检测对性能有很大影响。

解决办法是让边界框更准确。您可以使用 PolygonsShapes 或使边界矩形更小。

在你的情况下,我会考虑使用 PolygonShape。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2020-11-06
    • 2021-05-29
    • 2016-07-17
    • 2018-06-20
    相关资源
    最近更新 更多