Câu trả lời:
Điều này là do một khi đối tượng của bạn vào tường và bạn tìm thấy sự va chạm, bạn chỉ cần dừng chuyển động của đối tượng bằng cách đặt vận tốc của nó về 0, nhưng đối tượng vẫn ở trong bức tường đó.
Để khắc phục, bạn phải giải quyết va chạm bằng cách di chuyển đối tượng. Bạn có hai lựa chọn ở đây:
Thực hiện tùy chọn thứ hai
Ở đây tôi sẽ giả sử rằng vận tốc thể hiện hướng mà vật thể đang đi (về cơ bản là bạn không thay đổi vận tốc giữa thay đổi vị trí của vật thể và kiểm tra va chạm). Tôi cũng sẽ cho rằng nguồn gốc của bạn được đặt ở phía trên bên trái của hình ảnh (vì vậy khi di chuyển đối tượng để giải quyết va chạm, tôi sẽ định vị góc trên cùng bên trái).
Đây là cách tôi sẽ làm:
if (objRect.Intersects(wallRect)) // If there is a collision
{
Vector2 newPos = obj.Position;
if (obj.Velocity.X > 0) // object came from the left
newPos.X = wallRect.Left - objRect.Width;
else if (obj.Velocity.X < 0) // object came from the right
newPos.X = wallRect.Right;
if (obj.Velocity.Y > 0) // object came from the top
newPos.Y = wallRect.Top - objRect.Height;
else if (obj.Velocity.Y < 0) // object came from the bottom
newPos.Y = wallRect.Bottom;
obj.Position = newPos;
}
Bạn cũng có thể sử dụng vị trí của đối tượng cũ để tìm vị trí của đối tượng, nhưng sử dụng vận tốc đơn giản hơn trong trường hợp này.
Bạn có thể làm điều này theo nhiều cách khác nhau.
Một phương pháp là lưu trữ vị trí trước đó của Hình chữ nhật mỗi khung. Vì vậy, khi hình chữ nhật của bạn Giao nhau, chỉ cần đặt vị trí đối tượng thành vị trí cũ không va chạm. Phương pháp này không phải là tốt nhất, vì nếu tốc độ Hình chữ nhật cao, bạn có thể thấy vị trí mà bạn đã thực hiện thông qua mã.
Một phương pháp khác là kiểm tra sự va chạm với Raycast, vì vậy bạn có thể xem trước một vụ va chạm trước khi nó xảy ra.
Hãy xem msDN để biết tài liệu về vụ va chạm Raycast và bạn sẽ có thể làm điều đó.