Vì câu hỏi này dựa trên câu hỏi khác của bạn, tôi sẽ đưa ra giải pháp khi hình chữ nhật được căn chỉnh theo trục.
Đầu tiên, bạn xây dựng hình chữ nhật của đối tượng hiện tại với các giá trị sau:
int boxLeft = box.X;
int boxRight = boxLeft + box.Width;
int boxTop = box.Y;
int boxBottom = boxTop + box.Height;
Tiếp theo, bạn phải có vị trí của đối tượng cũ (mà bạn có thể lưu trữ trên mỗi đối tượng hoặc đơn giản là chuyển đến một chức năng) để tạo hình chữ nhật của đối tượng cũ (khi nó không va chạm):
int oldBoxLeft = box.OldX;
int oldBoxRight = oldBoxLeft + box.Width;
int oldBoxTop = box.OldY;
int oldBoxBottom = oldBoxTop + box.Height;
Bây giờ, để biết va chạm đến từ đâu, bạn phải tìm phía mà vị trí cũ không nằm trong khu vực va chạm và vị trí mới của nó. Bởi vì, khi bạn nghĩ về nó, đây là điều xảy ra khi bạn va chạm: một bên không va chạm vào một hình chữ nhật khác.
Đây là cách bạn có thể làm như vậy (các hàm này cho rằng có xung đột. Không nên gọi chúng nếu không có va chạm):
bool collidedFromLeft(Object otherObj)
{
return oldBoxRight < otherObj.Left && // was not colliding
boxRight >= otherObj.Left;
}
Rince và lặp lại.
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;
}
Bây giờ, để sử dụng thực tế với phản ứng va chạm từ câu hỏi khác:
if (collidedFromTop(otherObj) || collidedFromBottom(otherObj))
obj.Velocity.Y = -obj.Velocity.Y;
if (collidedFromLeft(otherObj) || collidedFromRight(otherObj))
obj.Velocity.X = -obj.Velocity.X;
Một lần nữa, đây có thể không phải là giải pháp tốt nhất nhưng đó là cách tôi thường đi để phát hiện va chạm.