Игровой враг двигает [закрытый] плеер

11
задан Chris 12 April 2010 в 20:36
поделиться

4 ответа

Создайте вектор в том направлении, в котором вы хотите, чтобы враг двигался. Это просто:

dir.x = player.x - enemy.x;
dir.y = player.y - enemy.y;

Теперь нормализуйте этот вектор. Это означает разделение членов на величину (гипотенузу) вектора.

hyp = sqrt(dir.x*dir.x + dir.y*dir.y);
dir.x /= hyp;
dir.y /= hyp;

Теперь вам просто нужно добавить этот вектор к позиции врага, умноженный на скорость, с которой вы хотите, чтобы враг двигался:

enemy.x += dir.x*speed;
enemy.y += dir.y*speed;

Вот как это работает - если вы добавите этот начальный вектор к позиции врага, он будет немедленно перенесен игроку. Очевидно, вы хотите, чтобы противник двигался с меньшей скоростью. Когда вы нормализуете вектор, вы делаете его величину (по сути, гипотенузу треугольника, который он формирует) равным 1. Итак, теперь добавление вектора направления перемещает противника на одну единицу. Умножьте эту единицу на скорость врага, и теперь он движется с правильной скоростью.

Edit: все это распространяется и на 3D. Вам просто нужен z-компонент.

Дальнейшие правки для комментариев к вашему коду:

Вы делаете много дополнительной работы. После вычисления гипотенузы у вас будет достаточно информации, чтобы переместить врага к игроку. Вам вообще не нужно использовать триггеры - см. Мой код выше. Вы также дважды вычисляете (как бы) величину:

float hypotenuse = sqrt((xDistance * xDistance) + (yDistance * yDistance));
...
(playerX - enemyX)*(playerX - enemyX)+(playerY - enemyY)*(playerY - enemyY)

Второй раз это квадрат расстояния, который является хорошей оптимизацией, но здесь не нужен, потому что вы уже вычислили расстояние и квадрат расстояния.

Вот что я бы сделал:

float xDistance = playerX-enemyX;
float yDistance = playerY-enemyY;
float hypotenuse = sqrt((xDistance * xDistance) + (yDistance * yDistance));

if(hypotenuse < 400){

        YPos += timeFactor*200*(yDistance/hypotenuse);
        XPos += timeFactor*200*(xDistance/hypotenuse);
}

Вы заметите, что, удалив abs (), мне также удалось удалить части if (playerY> неприятельY) и т. Д.

37
ответ дан 3 December 2019 в 01:13
поделиться

Используйте векторы . Это очень просто, и именно так это делают настоящие игры.

Если ваш игрок находится на позиции 10, 10 (предположим, что это двухмерное пространство), а ваш враг был на позиции 20, 10. Вектор от игрока к врагу:

Player - Enemy

или

(10, 10) - (20, 10) = -10, 0

Нормализация этого вектора дает вам единичный вектор или направление. Что в данном случае равно -1, 0. Умножьте единичный вектор (который является запоминающимся направлением) на скалярное значение в каждом кадре, и враг будет двигаться к игроку. Что произойдет, когда это произойдет, решать вам;)

5
ответ дан 3 December 2019 в 01:13
поделиться

Вот где вам нужен "алгоритм поиска пути". На чистом игровом поле вы могли бы следовать к цели по прямой линии. Однако, если на пути стоят препятствия, вам нужно предоставить ИИ решить, как лучше обойти их, и возможно ли это вообще.

Поиск на codeproject.com даст несколько статей о поиске пути.

1
ответ дан 3 December 2019 в 01:13
поделиться

Позиция игрока - точка1. Позиция противника - точка2. Сначала нужно найти разность между x1 и x2 и y1 и y2 (я буду называть их xd и yd). Затем вы можете получить угол между двумя точками, выполнив theta = atan(yd/xd). Теперь вы должны быть в состоянии получить новые x и y (которые я буду называть x3 и y3), используя угол и расстояние, которое вы хотите пройти, где x3 = (d)(cos(theta)) и y3 = (d)(sin(theta)). Переместите противника в точку (x3, y3).

d - это скорость перемещения противника за одно обновление. Возможно, вам придется поменять знаки, чтобы получить правильные направления (например, если враг движется в правильном направлении x, но в неправильном направлении y, измените знак y).

Надеюсь, это поможет!

1
ответ дан 3 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: