Ho il sospetto che tu stia usando una mappa delle tessere, nel qual caso la soluzione sarebbe quella di farlo in base agli indici delle tessere. Devi trovare su quale tessera il tuo mostro si trova attualmente, con le seguenti formule:
int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);
Una volta che li conosci, devi trovare in quale direzione X stai andando (per verificare la presenza di blocchi avanti):
int direction = 0;
if (monster.Velocity > 0f)
direction = 1;
if (monster.Velocity < 0f)
direction = -1;
Ora hai una direzione X normalizzata con cui lavorare.
Successivamente, ti consigliamo di controllare i blocchi in giro per vedere se dovresti cambiare direzione:
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
Hai un'idea generale. Assicurati di tornare TileCollision.Impassable
(o qualsiasi altra cosa) se gli indici delle tessere si trovano all'esterno della mappa, per evitare che il tuo programma si blocchi con un indice non valido e impedisca anche ai mostri di uscire dalla mappa.
Immagino che dipenda davvero dal modo in cui gestisci le piastrelle, ma questa è la soluzione che ha funzionato per me.
Basato sui tutorial su http://www.sgtconker.com/ (anche se il sito Web non funziona mentre lo scrivo)