Я подозреваю, что вы используете карту тайлов, и в этом случае решением будет сделать это на основе индексов тайлов. Вам нужно узнать, на какой плитке в данный момент находится ваш монстр, по следующим формулам:
int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);
Как только вы знаете это, вы должны найти, в каком направлении Х вы идете (чтобы проверить блоки впереди):
int direction = 0;
if (monster.Velocity > 0f)
direction = 1;
if (monster.Velocity < 0f)
direction = -1;
Теперь у вас есть нормализованное направление X для работы.
Далее, вы хотите проверить блоки вокруг, чтобы увидеть, если вы должны изменить направление:
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
Вы получите общую идею. Убедитесь, что вы возвращаете TileCollision.Impassable
(или что-то еще), если индексы плитки находятся за пределами карты, чтобы предотвратить сбой вашей программы с недопустимым индексом, а также предотвращает выход монстров за пределы карты.
Я думаю, это действительно зависит от того, как вы работаете с плитками, но это решение, которое сработало для меня.
Основано на учебниках с http://www.sgtconker.com/ (хотя сайт не работает, когда я пишу это)