現時点では、私のゲームでは問題なく動作していますが、私は数学が得意ではありません。2 つのプリミティブが衝突したとき、プリミティブに加えられた力が設定されたしきい値を超えた場合、それらが小さな破片に砕けるようにしたいと考えています。現在の衝突イベント ハンドラーは次のようになります。
public bool Collision(Fixture fixtureA, Fixture fixtureB, Manifold manifold)
{
Vector2 position = manifold.LocalNormal;
float angle = (float)Math.Atan2(position.Y, position.X);
Vector2 force = Vector2.Zero;
if (angle < 0)
force = new Vector2((float)(Math.Cos(angle) * fixtureA.Body.LinearVelocity.X), (float)Math.Sin(MathHelper.TwoPi + angle) * fixtureA.Body.LinearVelocity.Y);
else
force = new Vector2((float)(Math.Cos(angle) * fixtureA.Body.LinearVelocity.X), (float)Math.Sin(MathHelper.TwoPi - angle) * fixtureA.Body.LinearVelocity.Y);
double XForce = Math.Sqrt(force.X * force.X);
double YForce = Math.Sqrt(force.Y * force.Y);
double totalForce = XForce + YForce;
if ((Breakable) && (totalForce > BreakForce))
{
Breakable = false;
Active = false;
BreakUp(fixtureA, fixtureB);
}
return true;
}
ずっと前に遊んでいたときにそれを入れました。これにより、特定の状況で少し問題が発生します。たとえば、プリミティブが床に静止していて、別のプリミティブが適切な高さからその上に落下した場合、ほとんどの場合、落下したボックスは爆発し、静止しているボックスは生き残ります。また、2 つのボックスが並んで落下し、互いにわずかな接触を与えると、両方のボックスが空中で爆破されます。うーん、それは完璧ではありません。私の衝突ハンドラーを改善する方法を知っている人はいますか? 前もって感謝します。