2015-06-27 1 views
0

У меня есть класс 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.

Gameplay

+0

потому что он немного движется в X, а затем немного перемещается по Y ... и вообще выглядит, что он движется по диагонали? если это так ... тогда вы должны рассчитать разницу 'X' и' Y' между 'Enemy' и' Player'. Говорят, враг движется по координате X. поэтому он должен продолжить движение в X до тех пор, пока 'Enemy.X - Player.X' не приблизится к 0. затем начните движение по оси Y. –

+0

Hm продолжить движение в 'X', мне просто нужно установить' difference.Y' в 0, правильно? И когда 'difference.X' равно 0, он перемещается в' Y'. Я сделал это, но противник движется только на 'X' до правильной позиции, но никогда не двигается на« Y »после этого. – xRed

+0

Я не знаю, как ваш враг начинает двигаться. но я думаю, вы должны добавить еще одно условие, которое, если 'difference.X' равно 0, тогда начните движение на' Y'. –

ответ

0

Я думаю, вам нужно заменить если заявления с этим.

Bool Horizontal = true;//Bool that indicates the direction 


if (Math. Abs(directionToPlayer.Y) - Math.Abs(directionToPlayer.X)> 1)//your distance to change direction 
{ 
    Horizontal = false;//if y is bigger, don't move horizontal 
} 

if (Math. Abs(directionToPlayer.X) - Math.Abs(directionToPlayer.Y)> 1)//your distance to change direction 
{ 
    Horizontal = true; 
} 

If(Horizontal) 
    directionToPlayer.Y = 0; 
Else 
    directionToPlayer.X =0; 

Извините за макет, я нахожусь на мобильном телефоне.

+0

Хм я обновил ваш код, но противник никогда не следует за игроком по оси Y. Я думаю, что это связано с точностью поплавка? – xRed

+0

Я не знаю, на каком расстоянии вам нужно изменить направление. Я предположил, что 1, но я думаю, что это неправильно. Попробуйте 30 или около того –

Смежные вопросы