Не можете заставить пули стрелять под правильным углом?

У меня возникли проблемы с попыткой заставить пулю стрелять под углом, который я вставил. Я использую eclipse с java.

Мой код:

x += (int) (spd * Math.cos(dir));
y -= (int) (spd * Math.sin(dir));`

Такое ощущение, что причина, по которой он не работает, заключается в том, что он приведен к int, что, возможно, делает его таким неточным. Но для того, чтобы нарисовать прямоугольник, ему нужны целые числа.

При вводе dir как 0 все нормально и стреляет вправо. Проблема в том, что когда я ставлю 90, вместо того, чтобы снимать прямо вверх, он стреляет немного влево.

Любая идея о том, как я могу это исправить? Спасибо!


person mkjrfan    schedule 11.07.2013    source источник


Ответы (4)


Нет, вы совершаете классическую ошибку: триггерным функциям Java нужны радианы, а не градусы. Это не 90, что вы должны пройти; это /2.0.

Поэтому не забудьте преобразовать углы в градусах в радианы, умножив их на /180,0.

Это верно для C, C++, Java, JavaScript, C# и любого другого языка, который я знаю. Я не могу назвать единственный язык, использующий градусы для углов.

double radians = dir*Math.PI/180.0;
x += (int)(spd*Math.cos(dir));
y -= (int) (spd * Math.sin(dir));`  // I don't know why you do this.  Funny left-handed coordinate system.

Скорость есть величина вектора скорости. Уравнения в том виде, в котором они написаны, выражают скорость только в виде компонентов (vx, vy).

Если вам нужны смещения, вам придется умножить на временной шаг:

vx = speed*Math.cos(angle);
vy = speed*Math.sin(angle);
dx = vx*dt;
dy = vy*dt;
x += dx;  // movement in x-direction after dt time w/ constant velocity
y += dy;  // movement in y-direction after dt time w/ constant velocity

Если задействовано ускорение (например, сила тяжести), вы должны рассчитать изменение скорости во времени таким же образом.

person duffymo    schedule 11.07.2013
comment
О да, это тоже! Полностью пропустил эту часть. - person Amadan; 11.07.2013
comment
Я думаю, что это реальный корень проблемы. - person duffymo; 11.07.2013
comment
Хорошо, я не совсем уверен, как объяснить, что произошло, но я сделал это: dir = dir * Math.PI / 2.0; Но то, что получается, действительно странно, поскольку пули, кажется, кружат вокруг друг друга. - person mkjrfan; 11.07.2013
comment
На самом деле я исправил эту странную проблему, поместив ее в класс конструктора, но тогда она срабатывает только в 4 направлениях. Редактировать: на самом деле (опять же) ваше право, это работает, я просто поставил pi / 2.0, что я увидел первым, а не 180. Извините, но спасибо за вашу помощь! - person mkjrfan; 11.07.2013
comment
90 градусов = /2,0 радиана. Я не знаю, что ты делаешь. - person duffymo; 11.07.2013
comment
Нет, я просто тестировал на 90 градусов, но мне нужны были все углы. - person mkjrfan; 11.07.2013
comment
я понял; вот почему я рассказал вам, как преобразовать любой угол. Бьюсь об заклад, в вашем коде все еще много проблем. - person duffymo; 11.07.2013

Сохраняйте координаты как числа с плавающей запятой, приводя их только в вызове вашего метода рисования (или приводя их в другую переменную). Вам необходимо сохранить точные значения для следующей итерации.

person Amadan    schedule 11.07.2013
comment
Ну, что я сделал, так это вынул (int) и поместил его в метод get, но он все равно стреляет только в 8-9 разных направлениях. - person mkjrfan; 11.07.2013

Да, нужно держать угол как поплавки.

Но, скорее всего, вы сказали, что используете 0 и 90. Math.cos() и Math.sin() принимают значения в радианах. Если вы переходите в градусы, вы определенно будете двигаться в неправильном направлении. Преобразуйте градусы в радианы, и ваши направления, вероятно, будут намного лучше.

person user1676075    schedule 11.07.2013

Одна проблема заключается в том, что ошибка округления распространяется, когда вы увеличиваете x и y для каждой итерации. Одним из возможных решений является вычисление координат x и y на основе счетчика:

x = (int) (time * spd * Math.cos(dir));
y = (int) (time * spd * Math.sin(dir));

Здесь я использую имя переменной time для счетчика, чтобы указать, что это некоторая мера количества времени, прошедшего с момента выстрела пули.

person Code-Apprentice    schedule 11.07.2013