обновить координаты на основе угла и скорости - PullRequest
2 голосов
/ 28 августа 2011

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

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

У меня есть космический корабль в середине экрана. Он не двигается отдельно от вращения (user.fAngle). Он имеет скорость (user.dVelocity), которая используется исключительно для расчета его местоположения в мире.

Прямо сейчас у меня есть корабль, движущийся со скоростью 1. Это означает, что куда бы он ни шел, он движется с этой скоростью (опять же, исключительно для целей координат карты). Пока не замедляется или не ускоряется ... но в конечном итоге будет. Таким образом, скорость в конечном итоге будет изменяющейся переменной.

Вот что у меня сейчас ..

    double radians = (Math.PI / 180) * ( user.fAngle); 
    worldX = (int)(worldX + user.dVelocity * Math.cos(radians)); 
    worldY = (int)(worldY + user.dVelocity * Math.sin(radians));

user.fangle конечно = 0-359

worldX и worldY начинаются с 0, когда вы начинаете игру. Я пытаюсь модифицировать worldX и worldY каждый кадр, основываясь на угле корабля и жестко заданной скорости.

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

Другая проблема, которую я вижу, заключается в том, что, когда числа меняются, они всегда меняются с постоянной скоростью. Другими словами, допустим, север равен 0. Если я двигаюсь под углом 5, переменная worldY должна сильно изменяться, но worldX должна немного изменяться. Этого не происходит.

В своей отладке я убедился, что user.fAngle действительно находится в диапазоне 0-359. Я не уверен, что еще проверить.

Спасибо за чтение, и я ценю помощь.

Ответы [ 3 ]

3 голосов
/ 28 августа 2011

Ваша проблема связана с тем, что:

int x = 0;
x = x + 0.5; // rounding down : x == 0
x = x + 0.5; // rounding down : x == 0

Вам нужна переменная типа float для запоминания позиции.

float x = 0;
x = x + 0.5; // x == 0.5
worldX = (int)x; // worldX == 0
x = x + 0.5; // x == 1
worldX = (int)x; // worldX == 1

Это решит проблему.

0 голосов
/ 28 августа 2011

"... скажем, север равен 0. Если я двигаюсь под углом 5, переменная worldY должна сильно изменяться, но worldX должна немного изменяться. Этого не происходит".

В формулах, которые вы задали для движений X и Y, фактически предполагается, что север составляет 90 градусов.

В тригонометрии угол 0 градусов расположен вдоль оси + X, чтосоответствуют должному востоку на карте.Кроме того, в тригонометрии увеличение угла перемещает его против часовой стрелки вокруг начала координат.Если вы хотите, чтобы ваши углы действовали как заголовки компаса: север при 0 градусах, восток при 90 градусах и т. Д., Вы должны определить radians следующим образом:

double radians = (Math.PI / 180) * ( 90.0 - user.fAngle);
0 голосов
/ 28 августа 2011

Не уверен, что это сработает, но попробуйте умножить угол на PI перед делением на 180 при преобразовании угла в радианы.

double radians = (Math.PI * user.fAngle) / 180; 

EDIT:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...