У меня есть класс Enemy, который ищет игрока, если он находится в поле своего зрения. Проблема в том, что я хочу, чтобы противник двигался вверх/вниз/вправо/влево, а не как, например, вверх и влево в одно и то же время (движение по диагонали).Enemy Follow Player Ортогональное движение
EDIT: Обновленный код и изображения
private void SeekPlayer(Player player)
{
//directionToPlayer is a 2DVector
//Image is a class i made that takes a texture, position (Vector2D), etc..
directionToPlayer = player.Image.Position - Image.Position;
directionToPlayer.Normalize();
bool Horizontal = true;//Bool that indicates the direction
if (Math.Abs(directionToPlayer.Y) - Math.Abs(directionToPlayer.X) > 1f)//your distance to change direction
{
Horizontal = false;//if y is bigger, don't move horizontal
}
if (Math.Abs(directionToPlayer.X) - Math.Abs(directionToPlayer.Y) > 1f)//your distance to change direction
{
Horizontal = true;
}
if(Horizontal)
directionToPlayer.Y = 0;
else
directionToPlayer.X = 0;
Velocity = directionToPlayer;
Image.Position += Velocity;
UpdateFOV();
}
С текущего кода противник иногда следует играть по координатам X, и, когда это же самое у игрока, не продолжает следовать по координата Y. И наоборот для Y.
потому что он немного движется в X, а затем немного перемещается по Y ... и вообще выглядит, что он движется по диагонали? если это так ... тогда вы должны рассчитать разницу 'X' и' Y' между 'Enemy' и' Player'. Говорят, враг движется по координате X. поэтому он должен продолжить движение в X до тех пор, пока 'Enemy.X - Player.X' не приблизится к 0. затем начните движение по оси Y. –
Hm продолжить движение в 'X', мне просто нужно установить' difference.Y' в 0, правильно? И когда 'difference.X' равно 0, он перемещается в' Y'. Я сделал это, но противник движется только на 'X' до правильной позиции, но никогда не двигается на« Y »после этого. – xRed
Я не знаю, как ваш враг начинает двигаться. но я думаю, вы должны добавить еще одно условие, которое, если 'difference.X' равно 0, тогда начните движение на' Y'. –