【问题标题】:How do I force two Box2D bodies to avoid colliding when they spawn on top of each other?如何强制两个 Box2D 物体在它们相互重叠时避免碰撞?
【发布时间】:2015-07-24 19:08:05
【问题描述】:

我正在创建一个横向卷轴动作游戏,你可以在其中扮演一个可以施法的巫师。咒语是 Box2D 实体,从您的玩家(也是 Box2D 实体)的中间开始,并朝您在屏幕上单击的方向向外延伸。

我有所有的碰撞检测工作,以确保你施放的法术不会相互碰撞,它们也不会与你发生碰撞。这或多或少完美无瑕——除了一个实例。我施放的第一个法术会与玩家发生碰撞,造成短暂的物理击退。否则法术的路径不会受到影响,我没有注意到玩家位置的重大变化。我知道有击退的唯一原因是因为我跟随玩家的相机在那一刻突然摇晃(我已经通过接触侦听器来验证这些特定的身体正在形成接触)。

对于从同一位置生成的后续法术而言,情况并非如此,并且似乎与玩家的移动速度或弹丸的施法角度无关。这可能与 Box2D 初始化项目的方式有关,但我不能保证。

有谁知道我该如何解决这个问题?

【问题讨论】:

标签: java libgdx box2d


【解决方案1】:

正如韦斯顿所说,可能需要更多代码,但“第一个咒语”这样做听起来很奇怪,但随后的生成却没有。您是否将身体重复用于后续生成?

在 box2d 中,如果您创建 2 个占据相同空间的物体,它们将相互“击退”,这样它们就不会占据相同的空间。这是设计使然,并且仅在创建时发生。我确定这就是你所看到的。为什么它不会在“之后”发生可能取决于您的代码。

解决此问题的方法可能是将一些固定装置设置为传感器(忽略碰撞),或者在创建主体时设置 active=false(同样,忽略碰撞)。 “暂时”是指您可能必须编写一些代码来移动您的咒语,忽略碰撞,直到您的咒语“清除”您的巫师。然后移除传感器或使其处于活动状态,以便重新开始碰撞。

但这可能是矫枉过正,弄清楚后续“跨度”与您的第一个“跨度”的微妙之处可能是更好地利用努力。

【讨论】:

    【解决方案2】:

    我设法弄清楚问题出在哪里以及如何解决它,但我无法弄清楚它发生的原因。

    我正在使用 OrthographicCamera 来调整我的玩家的位置。

    position.x += (universe.entity_handler.player.parts[0].body.getPosition().x - position.x) * Gdx.graphics.getDeltaTime() * 
    position.y += (universe.entity_handler.player.parts[0].body.getPosition().y - position.y) * Gdx.graphics.getDeltaTime() * LERP + zoom * viewportHeight / WORLD_PLAYER_Y_SKEW;
    

    当我通过消除所有 lerping 来解决此问题时,抖动消失了。

    position.x = universe.entity_handler.player.parts[0].body.getPosition().x;
    position.y = universe.entity_handler.player.parts[0].body.getPosition().y;
    

    我不知道为什么线性插值会导致这样的痉挛运动,但是嘿 - 我让它工作了。也许我稍后会回去重新审视这个问题。

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 2016-04-16
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多