Da dies auf Ihrer anderen Frage basiert, gebe ich eine Lösung für den Fall, dass das Rechteck achsenausgerichtet ist.
Zunächst bauen Sie das Rechteck Ihres aktuellen Objekts mit den folgenden Werten auf:
int boxLeft = box.X;
int boxRight = boxLeft + box.Width;
int boxTop = box.Y;
int boxBottom = boxTop + box.Height;
Als nächstes müssen Sie die Position des alten Objekts haben (die Sie auf jedem Objekt speichern oder einfach an eine Funktion übergeben können), um das Rechteck des alten Objekts zu erstellen (wenn es nicht kollidierte):
int oldBoxLeft = box.OldX;
int oldBoxRight = oldBoxLeft + box.Width;
int oldBoxTop = box.OldY;
int oldBoxBottom = oldBoxTop + box.Height;
Um zu wissen, woher die Kollision stammt, müssen Sie die Seite finden, auf der sich die alte Position nicht im Kollisionsbereich befand und auf der sich ihre neue Position befindet. Denn wenn Sie daran denken, passiert Folgendes, wenn Sie kollidieren: Eine Seite, die nicht kollidiert, tritt in ein anderes Rechteck ein.
So können Sie dies tun (diese Funktionen setzen eine Kollision voraus. Sie sollten nicht aufgerufen werden, wenn keine Kollision vorliegt):
bool collidedFromLeft(Object otherObj)
{
return oldBoxRight < otherObj.Left && // was not colliding
boxRight >= otherObj.Left;
}
Rince und wiederholen.
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;
}
Nun zur tatsächlichen Verwendung mit der Kollisionsantwort aus der anderen Frage:
if (collidedFromTop(otherObj) || collidedFromBottom(otherObj))
obj.Velocity.Y = -obj.Velocity.Y;
if (collidedFromLeft(otherObj) || collidedFromRight(otherObj))
obj.Velocity.X = -obj.Velocity.X;
Auch dies ist möglicherweise nicht die beste Lösung, aber so gehe ich normalerweise zur Kollisionserkennung vor.