私は自分のプロジェクトで Angry Birds のようなゲームを作成しています。最も基本的なことを除いて、ほとんどのことが行われます。一番苦労するのはダメージです。私は、Box2d のラッパーを提供する libgdx を使用しているので、Box2d を知っている人にとってコードが異質であってはなりません。これがpostSolveメソッドです
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
float[] forces = impulse.getNormalImpulses();
int index1 = (Integer) contact.getFixtureA().getBody().getUserData();
int index2 = (Integer) contact.getFixtureB().getBody().getUserData();
if( forces[0] > 0.3 )
bodies.get(index1).handleCollision(forces[0]);
if( forces[1] > 0.3 )
bodies.get(index2).handleCollision(forces[1]);
}
これにより、衝突しているボディが引き出され、ダメージを処理できるように通常の衝突インパルスが渡されます。これはボディの 1 つのダメージ ハンドラー関数です。
@Override
public void handleCollision(float impulse) {
health -= impulse;
else if( health < 50 )
isFlaggedForDelete = true;
}
最初にサイズに基づいてすべてのボディに健康値を与え、十分に強い衝突が発生するたびにそれに応じてダメージを受けるはずです。
問題は、ボディが画像のように配置されていることです。ブロックのいずれかでわずかな衝突が発生しても動かない場合はいつでも、構造全体 (私は推測します) が振動し始め、下にあるブロックが破壊され (健康のために)、構造全体が倒れます。
b2VelocityThreshold を最大値に設定しました (さらに値を大きくすると、ゲーム内での体の挙動が悪くなります)。postSolve メソッドも、十分に高いしきい値を設定します。私のアプローチの何が問題になっていますか?
ありがとう。