Оскільки це засноване на вашому іншому запитанні, я дам рішення, коли прямокутник вирівняний по осі.
Спочатку ви збираєте прямокутник поточного об'єкта з такими значеннями:
int boxLeft = box.X;
int boxRight = boxLeft + box.Width;
int boxTop = box.Y;
int boxBottom = boxTop + box.Height;
Далі ви повинні мати положення старого об'єкта (яке ви можете зберегти на кожному об'єкті або просто передати функції) для створення прямокутника старого об'єкта (коли він не стикався):
int oldBoxLeft = box.OldX;
int oldBoxRight = oldBoxLeft + box.Width;
int oldBoxTop = box.OldY;
int oldBoxBottom = oldBoxTop + box.Height;
Тепер, щоб знати, звідки відбулося зіткнення, ви повинні знайти сторону, де старе положення не було в зоні зіткнення та де його нове положення. Тому що, коли ви думаєте про це, саме це відбувається при зіткненні: сторона, яка не стикалася, входить в інший прямокутник.
Ось як ви могли це зробити (ці функції припускають зіткнення. Їх не слід викликати, якщо немає зіткнення):
bool collidedFromLeft(Object otherObj)
{
return oldBoxRight < otherObj.Left && // was not colliding
boxRight >= otherObj.Left;
}
Змийте і повторіть.
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;
}
Тепер для фактичного використання з відповіддю на інше запитання:
if (collidedFromTop(otherObj) || collidedFromBottom(otherObj))
obj.Velocity.Y = -obj.Velocity.Y;
if (collidedFromLeft(otherObj) || collidedFromRight(otherObj))
obj.Velocity.X = -obj.Velocity.X;
Знову ж таки, це може бути не найкращим рішенням, але саме так я зазвичай іду для виявлення зіткнень.