Poiché questo si basa sull'altra tua domanda, fornirò una soluzione per quando il rettangolo è allineato agli assi.
Innanzitutto, costruisci il rettangolo dell'oggetto corrente con i seguenti valori:
int boxLeft = box.X;
int boxRight = boxLeft + box.Width;
int boxTop = box.Y;
int boxBottom = boxTop + box.Height;
Successivamente, è necessario disporre della posizione dell'oggetto vecchio (che è possibile memorizzare su ciascun oggetto o semplicemente passare a una funzione) per creare il rettangolo dell'oggetto vecchio (quando non si è scontrato):
int oldBoxLeft = box.OldX;
int oldBoxRight = oldBoxLeft + box.Width;
int oldBoxTop = box.OldY;
int oldBoxBottom = oldBoxTop + box.Height;
Ora, per sapere da dove proviene la collisione, devi trovare il lato in cui la vecchia posizione non era nell'area di collisione e dove si trova la sua nuova posizione. Perché, quando ci pensi, questo è ciò che accade quando ti scontri: un lato che non si scontra entra in un altro rettangolo.
Ecco come potresti farlo (queste funzioni presuppongono che ci sia una collisione. Non dovrebbero essere chiamate se non ci sono collisioni):
bool collidedFromLeft(Object otherObj)
{
return oldBoxRight < otherObj.Left && // was not colliding
boxRight >= otherObj.Left;
}
Scuotere e ripetere.
bool collidedFromRight(Object otherObj)
{
return oldBoxLeft >= otherObj.Right && // was not colliding
boxLeft < otherObj.Right;
}
bool collidedFromTop(Object otherObj)
{
return oldBoxBottom < otherObj.Top && // was not colliding
boxBottom >= otherObj.Top;
}
bool collidedFromBottom(Object otherObj)
{
return oldBoxTop >= otherObj.Bottom && // was not colliding
boxTop < otherObj.Bottom;
}
Ora, per l'uso effettivo con la risposta alla collisione dell'altra domanda:
if (collidedFromTop(otherObj) || collidedFromBottom(otherObj))
obj.Velocity.Y = -obj.Velocity.Y;
if (collidedFromLeft(otherObj) || collidedFromRight(otherObj))
obj.Velocity.X = -obj.Velocity.X;
Ancora una volta, questa potrebbe non essere la soluzione migliore, ma di solito vado per il rilevamento delle collisioni.