Box2D:继续模拟 body,同时忽略来自特定物体的力

Box2D: Keep simulating a body while ignoring forces from specific bodies

我在世界上有两个身体。第一个是四处走动的玩家。 第二,敌人试图攻击玩家。我想为玩家实现一个盾牌,这样当敌人接触到玩家时,它不会影响玩家的线速度,而是继续移动。

我尝试添加第三个 body 作为将其绑定到播放器的运动学(它比播放器大一点)但由于某种原因,当线性脉冲应用于播放器时它会粘在墙上.

所以我试图强制停止玩家并将玩家的反向线速度应用于敌人。当我的播放器稳定但不移动时,这很好用。

我怎样才能使它像 body 一样具有动态的所有功能,保持移动但不受敌人攻击的影响。

这是我尝试在播放器稳定时正常工作的代码,因为我在击中后将线速度归零,但这并不是一个真正干净的解决方案。

我真的可以拥有运动机构并对它们使用 applyLinearImpulse 吗?我看到的运动机构的问题是,我的玩家会简单地忽略墙壁,但它仍然应该与墙壁和世界上的其他任何东西发生碰撞,除了敌人应该像撞墙一样弹跳玩家。

func postSolve(contact: b2Contact, impulse: b2ContactImpulse) {
  ...
  if player.ShieldActive {
    let playervelocity = player.getLinearVelocity()
    player.forceStop // sets linearvelocity to zero including angularvelocity
    enemy.applyLinearImpulse( playervelocity.invert()*0.1) // apply the inverted velocity of the player with a scalar so the enemy moves aways like it hit a wall
  }
  ...
}

在我的播放器大小中添加单独的主体作为运动学并设置正确的类别和掩码位使之成为可能。当护盾激活时,我可以自由移动并且敌人无法再伤害我的玩家。