Tôi nghi ngờ bạn đang sử dụng bản đồ ô vuông, trong trường hợp đó, giải pháp sẽ được thực hiện dựa trên các chỉ số ô. Bạn cần tìm xem gạch quái vật của bạn hiện đang ở trên, với các công thức sau:
int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);
Khi bạn biết những điều này, bạn phải tìm hướng X mà bạn đang đi (để kiểm tra các khối phía trước):
int direction = 0;
if (monster.Velocity > 0f)
direction = 1;
if (monster.Velocity < 0f)
direction = -1;
Bây giờ bạn có một hướng X được chuẩn hóa để làm việc.
Tiếp theo, bạn sẽ muốn kiểm tra các khối xung quanh để xem bạn có nên đổi hướng hay không:
if (GetTileCollision(tileX + direction, tileY) == TileCollision.Impassable || // going into a wall
GetTileCollision(tileX + direction, tileY) == TIleCollision.Passable &&
GetTileCollision(tileX + direction, tileY + 1) == TileCollision.Passable)) // we're going to fall down a block
ChangeDirection(); // we change direction
Bạn nhận được các ý tưởng chung. Đảm bảo rằng bạn quay lại TileCollision.Impassable
(hoặc bất cứ điều gì) nếu các chỉ số ô nằm ngoài bản đồ, để ngăn chương trình của bạn gặp sự cố với chỉ mục không hợp lệ và điều đó cũng ngăn quái vật ra khỏi bản đồ.
Tôi đoán nó thực sự phụ thuộc vào cách bạn xử lý gạch nhưng đây là giải pháp hiệu quả với tôi.
Dựa trên các hướng dẫn tắt http://www.sgtconker.com/ (mặc dù trang web không hoạt động khi tôi viết bài này)