2015-06-23 2 views
0

В настоящее время у меня есть движение моего врага, где они начинают двигаться к врагу, но я хочу изменить это, чтобы двигаться только к игроку, если игрок попадает на определенное расстояние врага, поэтому я буду нужно создать какой-то код для работы там, где находится враг, и если они находятся в пределах 175 пикселей, враг начнет двигаться. Я не уверен, как реализовать это в коде, который у меня уже есть.Расстояние обнаружения врагов

Это код моего вражеского класса для передвижения: он использует триггер для вычисления кратчайшего расстояния до врага, а затем подталкивает вражеский объект к игроку. Как только произошло столкновение, игрок удаляется.

class Enemy : Obj 
{ 
    float spd = 1; 
    float detectionDistance = 175; 

    public Enemy(Vector2 pos) 
     : base(pos) 
    { 
     position = pos; 
     spriteName = "BlackBall"; 
     speed = spd; 
    } 

    public override void Update() 
    { 
     rotation = point_direction(position.X, position.Y, Player.player.position.X, Player.player.position.Y); 
     speed = spd; 

     base.Update(); 
    } 

    public override void pushTo(float pix, float dir) 
    { 
     float newX = (float)Math.Cos(MathHelper.ToRadians(dir)); 
     float newY = (float)Math.Sin(MathHelper.ToRadians(dir)); 
     newX *= pix; 
     newY *= pix; 
     if (!Collision(new Vector2(newX, newY), new Player(Vector2.Zero))) 
     { 
      base.pushTo(pix, dir); 
     } 
    } 

    //Uses Trig to calculate the shortest distance to the player then moves towards that position 
    private float point_direction(float x, float y, float x2, float y2) 
    { 
     float diffx = x - x2; 
     float diffy = y - y2; 
     float adj = diffx; 
     float opp = diffy; 
     float tan = opp/adj; 
     float res = MathHelper.ToDegrees((float)Math.Atan2(opp, adj)); 
     res = (res - 180) % 360; 
     if (res < 0) { res += 360; } 
     return res; 
    } 

ответ

0
public override void Update() 
{ 
    rotation = point_direction(position.X, position.Y, Player.player.position.X, Player.player.position.Y); 
    distance = sqrt(xdiff^2 + ydiff^2) <-- This line is pseudo-code 
    if(distance<detectionDistance) 
    { 
     speed = spd; 
    } 
    else 
    { 
     speed = 0 
    } 

    base.Update(); 
} 
+0

немного больше контекста для вашего ответа было бы хорошо. Нужно ли мне заменять строку, добавить ли это в строку I? что мне делать с этим –

+0

Я не могу дать вам больше контекста, не видя остальной код. Вам нужно проверить, не превышает ли расстояние меньше 175 (чтобы следовать вашему примеру), и если да, переместите противника, если нет, не перемещайте противника. Не совсем уверен, что вопрос должен быть честным. – BruceDoh

+0

Я отредактировал свой ответ, чтобы показать вам свой вражеский класс и весь его код. Я ищу, чтобы переместить врага в сторону игры, только если игрок находится в пределах 175 пикселей от врага. –

0

Используйте расстояние формулы и проверить, если позиция игрока находится в пределах 175 единиц.

public override void Update() 
{ 
    rotation = point_direction(position.X, position.Y, Player.player.position.X, Player.player.position.Y); 
    speed = Math.Sqrt(Math.Pow(Math.Abs(Player.player.position.X - position.X), 2.0) + Math.Pow(Math.Abs(Player.player.position.Y - position.Y), 2.0))) <= 175 ? spd : 0; 

    base.Update(); 
} 
+0

Ввод этой строки в мою программу дает мне ошибку «Operator '^» не может применяться к операндам типа float и float –

+0

Неплохо, вам нужно использовать Math Я буду исправлять это.Я буду предупреждать вас, что Math.Pow будет немного медленнее, чем использование оператора питания, так как он должен работать с плавающей точкой.Если вы беспокоитесь о производительности, вам может потребоваться передать в int (обрезать) и использовать ^. – Bob

+1

Я думал об этом больше и понял, что попытка сделать круг будет довольно интенсивной. Лечить его как квадрат может быть проще и он останется незамеченным пользователем: 'speed = math.Abs (Player.player.position.X - position.X) <175 && math.Abs ​​(Player.player.position.Y - position.Y) <175? Spd: 0; ' – Bob

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