Saya menduga Anda menggunakan peta ubin, dalam hal ini solusinya adalah melakukannya berdasarkan indeks ubin. Anda perlu mencari di ubin apa rakasa Anda aktif, dengan rumus berikut:
int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);
Setelah Anda mengetahui ini, Anda harus menemukan ke arah X mana Anda akan pergi (untuk memeriksa blok di depan):
int direction = 0;
if (monster.Velocity > 0f)
direction = 1;
if (monster.Velocity < 0f)
direction = -1;
Sekarang Anda memiliki arah X yang dinormalisasi untuk bekerja dengannya.
Selanjutnya, Anda akan ingin memeriksa blok di sekitar untuk melihat apakah Anda harus mengubah arah:
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
Anda mendapatkan ide umum. Pastikan Anda kembali TileCollision.Impassable
(atau apa pun) jika indeks ubin berada di luar peta, untuk mencegah program Anda menabrak indeks yang tidak valid, dan itu juga mencegah monster keluar di luar peta.
Saya kira itu benar-benar tergantung pada cara Anda menangani ubin, tetapi ini adalah solusi yang bekerja untuk saya.
Berdasarkan tutorial dari http://www.sgtconker.com/ (walaupun situs web sedang down saat saya menulis ini)