Sospecho que está utilizando un mapa de mosaicos, en cuyo caso la solución sería hacerlo en función de los índices de mosaicos. Debes encontrar en qué mosaico está actualmente tu monstruo, con las siguientes fórmulas:
int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);
Una vez que sepa esto, debe encontrar en qué dirección X va (para verificar si hay bloques por delante):
int direction = 0;
if (monster.Velocity > 0f)
direction = 1;
if (monster.Velocity < 0f)
direction = -1;
Ahora tiene una dirección X normalizada para trabajar.
A continuación, querrá verificar los bloques para ver si debe cambiar de dirección:
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
Tienes la idea general. Asegúrate de regresar TileCollision.Impassable
(o lo que sea) si los índices de mosaico están fuera del mapa, para evitar que tu programa se bloquee con un índice no válido, y también evita que los monstruos salgan del mapa.
Supongo que realmente depende de la forma en que manejas los mosaicos, pero esta es la solución que funcionó para mí.
Basado en los tutoriales de http://www.sgtconker.com/ (aunque el sitio web está inactivo mientras escribo esto)