Étant donné que cela est basé sur votre autre question, je vais donner une solution lorsque le rectangle est aligné sur l'axe.
Tout d'abord, vous créez le rectangle de votre objet actuel avec les valeurs suivantes:
int boxLeft = box.X;
int boxRight = boxLeft + box.Width;
int boxTop = box.Y;
int boxBottom = boxTop + box.Height;
Ensuite, vous devez avoir la position de l'ancien objet (que vous pouvez stocker sur chaque objet ou simplement passer à une fonction) pour créer le rectangle de l'ancien objet (lorsqu'il n'était pas en collision):
int oldBoxLeft = box.OldX;
int oldBoxRight = oldBoxLeft + box.Width;
int oldBoxTop = box.OldY;
int oldBoxBottom = oldBoxTop + box.Height;
Maintenant, pour savoir d'où vient la collision, vous devez trouver le côté où l'ancienne position n'était pas dans la zone de collision et où se trouve sa nouvelle position. Parce que, quand on y pense, c'est ce qui se passe quand on entre en collision: un côté qui n'entre pas en collision entre dans un autre rectangle.
Voici comment vous pouvez le faire (ces fonctions supposent qu'il y a une collision. Elles ne doivent pas être appelées s'il n'y a pas de collision):
bool collidedFromLeft(Object otherObj)
{
return oldBoxRight < otherObj.Left && // was not colliding
boxRight >= otherObj.Left;
}
Rincez et répétez.
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;
}
Maintenant, pour l'utilisation réelle avec la réponse de collision de l'autre question:
if (collidedFromTop(otherObj) || collidedFromBottom(otherObj))
obj.Velocity.Y = -obj.Velocity.Y;
if (collidedFromLeft(otherObj) || collidedFromRight(otherObj))
obj.Velocity.X = -obj.Velocity.X;
Encore une fois, ce n'est peut-être pas la meilleure solution, mais c'est la façon dont je procède habituellement pour la détection des collisions.