atan2 - найти угол между двумя точками (360 градусов) - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть игра, в которой есть Player и немного enemies. Эти враги, как и сам игрок, могут стрелять bullets. Но angle пуль не меняются, как положено; Вновь созданная пуля должна найти угол между собой и игроком, а затем просто пойти в этом направлении - это должно быть сделано в 360°.

Я следовал этому ответу , но я считаю, что сделал что-то неправильное.

потому что так происходит:
enter image description here

и так и должно быть:
enter image description here

в настоящее время это выглядит так:
enter image description here

Это часть кода, которая заботится о X & Y пуль:

angle = Math.atan2(Game.getPlayerY(), Game.getPlayerX()) - Math.atan2(getY(), getX());
if (angle < 0) 
    angle += 2 * Math.PI;
setX((getX()+(float)(Math.sin(angle)))-Config.BulletSpeed);
setY((getY()+(float)(Math.cos(angle)))-Config.BulletSpeed);

Как заставить Bullets идти под определенным углом?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Я согласен с ответом Энди;вам действительно нужен только нормализованный вектор между двумя точками, а не угол.Но если вам нужен угол, вы просто формируете вектор между двумя точками, а затем используете Math.atan2:

let velocity = new Vector(target.x - source.x, target.y - source.y);
let angle = Math.atan2(velocity.y, velocity.x);

Затем, если вам нужношаг x или y от источника к цели нормализует вектор, а затем просто используйте velocity.x и velocity.y:

// normalize
let magnitude = Math.sqrt(velocity.x*velocity.x + velocity.y*velocity.y);  // distance formula for length of vector
velocity.x /= magnitude;
velocity.y /= magnitude;

// scaled to speed you want
velocity.x *= SPEED;
velocity.y *= SPEED;

Вам не нужновыведите вектор из угла, который вы вывели из вектора.

РЕДАКТИРОВАТЬ : Как отметил Топако в комментариях, чтобы добавить реалистичное прикосновение, добавьте исходную скорость к конечной скорости:

velocity.x += source_velocity.x
velocity.y += source_velocity.y
0 голосов
/ 15 сентября 2018

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

Все, что вам нужно сделать, это нормализовать вектор. Длина линии между двумя вещами определяется как:

double dx = Game.getPlayerX() - getX();
double dy = Game.getPlayerY() - getY();
double len = Math.hypot(dx, dy);

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

double s = Config.BulletSpeed / len;

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

setX((getX()+dx*s);
setY((getY()+dy*s);
...