Suspeito que você esteja usando um mapa de blocos, caso em que a solução seria fazê-lo com base nos índices de blocos. Você precisa encontrar em qual bloco seu monstro está atualmente, com as seguintes fórmulas:
int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);
Depois de conhecê-los, você precisa descobrir em qual direção X você está indo (para verificar os blocos à frente):
int direction = 0;
if (monster.Velocity > 0f)
direction = 1;
if (monster.Velocity < 0f)
direction = -1;
Agora você tem uma direção X normalizada para trabalhar.
Em seguida, verifique os blocos para ver se deve mudar de direção:
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
Você entende a ideia geral. Certifique-se de retornarTileCollision.Impassable
(ou o que for) se os índices do bloco estiverem fora do mapa, para impedir que seu programa caia com um índice inválido e também para impedir que monstros saiam do mapa.
Eu acho que depende realmente da maneira como você lida com os ladrilhos, mas esta é a solução que funcionou para mim.
Com base nos tutoriais de http://www.sgtconker.com/ (embora o site esteja em baixo enquanto eu escrevo isso)