私は世界に2つの身体を持っています。最初は、移動するプレーヤーです。 秒間、敵はプレイヤーにヒットしようとします。私はプレーヤーのためにシールドを実装したいので、敵がプレイヤーに触れるときにプレーヤーの線速度に影響を与えず、代わりに動き続けます。Box2D:特定の身体からの力を無視して身体をシミュレートし続ける
私は、それをプレイヤー(それはプレーヤーよりも少し大きい)にバインドするキネマティックとして追加しようとしましたが、プレーヤーに線形インパルスが適用されたとき何らかの理由で壁に固執していました。
私はプレイヤーにストップを強制して、プレイヤーの逆線速度を敵に適用しようとしました。それは私のプレーヤーが安定しているが動いていないときにうまくいく。
どのように私はダイナミックのすべての機能が動いているが、敵のヒットの影響を受けていない体をキネマティックにすることができます。
これは、ヒット後に線速度がゼロになってからプレーヤーが安定しているときにうまく動作しようとしたコードですが、これは本当にクリーンな解決策ではありません。
私は実際にキネマティックボディを持ち、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
}
...
}