Je soupçonne que vous utilisez une carte de tuiles, auquel cas l'une des solutions serait de le faire sur la base d'indices de tuiles. Vous devez trouver sur quelle tuile votre monstre se trouve actuellement, avec les formules suivantes:
int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);
Une fois que vous les connaissez, vous devez trouver dans quelle direction X vous allez (afin de vérifier les blocs à venir):
int direction = 0;
if (monster.Velocity > 0f)
direction = 1;
if (monster.Velocity < 0f)
direction = -1;
Vous avez maintenant une direction X normalisée avec laquelle travailler.
Ensuite, vous voudrez vérifier les blocs autour pour voir si vous devez changer de direction:
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
Vous avez l'idée générale. Assurez-vous que vous retournez TileCollision.Impassable
(ou quoi que ce soit) si les indices de tuile sont en dehors de la carte, pour empêcher votre programme de planter avec un index non valide, et cela empêche également les monstres de sortir de la carte.
Je suppose que cela dépend vraiment de la façon dont vous manipulez les carreaux, mais c'est la solution qui a fonctionné pour moi.
Basé sur les tutoriels de http://www.sgtconker.com/ (bien que le site Web soit en panne au moment où j'écris ceci)