Ho questo funzionamento ok (ish) nel mio gioco al momento, ma non sono fantastico in matematica. Quando due primitivi si scontrano, voglio che si trasformino in minuscoli bit se la forza applicata a un primativo era superiore a una soglia impostata. Il mio gestore di eventi di collisione al momento assomiglia a questo.Problemi del gestore di eventi OnCollision in C# XNA con Farseer Physics
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;
}
L'ho messo tanto tempo fa, mentre stavo solo giocando. Ciò causa un po 'di problemi in determinate situazioni. Per esempio, se un primitivo è fermo sul pavimento e un altro primitivo cade su di esso da un'altezza decente, quasi sempre, la scatola che cade esplode e la scatola di riposo sopravvive. Anche se due scatole stanno cadendo fianco a fianco e si danno il più piccolo dei tocchi, allora entrambe le scatole esploderanno a mezz'aria. Hmmmmm, non proprio perfetto. Qualcuno ha qualche idea su come migliorare il mio gestore di collisioni? Grazie in anticipo.
Ciao Andrew, Grazie per la risposta. La mia funzione BreakUp() aggiunge semplicemente un carico di nuovi primati in una lista basata sulla posizione del primitivo di rottura (i chip se vuoi) che non vengono aggiunti fino alla fisica successiva "Step()". Allo stesso modo una scatola distrutta viene semplicemente contrassegnata per essere rimossa nel nextstep. Quindi nel tuo esempio ... userei LocalPoint piuttosto che la variabile di posizione nella tua funzione corretta? Inoltre posso vedere che crea una variabile hitVelocity ma non sono sicuro di come questo si riferisca alla forza applicata all'oggetto. Conosco F = MA ma gli angoli non entrano in gioco qui? – DrLazer
Sì, utilizzare LocalPoint. La mia variabile di posizione è nello spazio mondiale (quindi trova l'equivalente di spazio locale di GetVelocityAtWorldPoint). Per trovare la forza è necessario l'accelerazione (F = MA). Puoi approssimare l'accelerazione determinando quanto cambierà la velocità in quel fotogramma (differenza di velocità divisa per il tempo). –
Vedi anche: http://en.wikipedia.org/wiki/Impulse_(physics) –