我如何强制两个 Box2D 物体在彼此重叠时避免碰撞?

How do I force two Box2D bodies to avoid colliding when they spawn on top of each other?

我正在制作一款横向卷轴动作游戏,您可以在其中扮演一个可以施法的巫师。这些法术是 Box2D 体,从玩家(也是 Box2D body)的中间开始,然后按照您在屏幕上单击的方向向外移动。

我让所有的碰撞检测工作到你施放的咒语不会相互碰撞并且它们不会与你碰撞的地方。这 more-or-less 完美无瑕——除了一个例子。我施放的第一个法术会与玩家发生碰撞,造成短暂的物理击退。咒语的路径不会受到其他影响,而且我没有注意到玩家位置的重大变化。我知道存在击退的唯一原因是因为我跟随玩家的相机在那一瞬间突然摇晃(我已经通过接触侦听器来验证这些特定的物体是否正在形成接触)。

对于从同一位置产生的后续法术,情况并非如此,而且这似乎不是与玩家移动速度或射弹投射角度相关的问题。这可能与Box2D如何初始化项目有关,但我不能保证。

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

正如 weston 所提到的,可能需要更多代码,但 "the first spell" 这样做听起来确实很奇怪,但随后的生成却没有。您是否会为后续的产卵重复使用尸体?

在 box2d 中,如果您创建 2 个占据相同 space 的物体,它们将 "knockback" 彼此分开,这样它们就不会占据相同的 space。这是设计使然,并且仅在创建时发生。我确定这就是您所看到的。为什么它不会发生 "afterwards" 可能取决于您的代码。

解决这个问题的方法可能是将一些固定装置设置为传感器(忽略碰撞),或者在创建主体时设置 active=false(再次忽略碰撞)。 "for a bit" 我的意思是您可能必须编写一些代码来移动您的咒语,忽略碰撞,直到您的咒语拥有 "cleared" 您的巫师。然后移除传感器或将其激活,以便碰撞重新开始。

但这可能有点矫枉过正,找出后续 "spans" 与第一个的微妙之处可能是更好地利用努力。

我设法弄清楚了问题出在哪里以及如何解决它,但我无法弄清楚为什么会这样。

我正在使用 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;

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