Направление движущегося спрайта

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

xPos += xSpeed * direction;
yPos += ySpeed * direction;

Если я использую разные значения xSpeed = 2 и YSpeed = 1, я могу перейти на разные диагональные пути, но мне все равно нужна та же скорость. Если я увеличу значение xSpeed = 4, чтобы получить другой диагональный путь, то скорость также увеличится, и я хочу, чтобы мяч двигался с той же скоростью. Для значения direction я использую 1 или -1. Но я думаю, было бы лучше изменить значение direction, чтобы получить диагональные пути в градусах? В игре прорыва мяч должен отскакивать в противоположном направлении. Я не силен в математике, поэтому я был бы признателен за помощь в решении этой проблемы. Любые идеи, как я могу улучшить свой код?


person 3D-kreativ    schedule 28.03.2013    source источник


Ответы (1)


Вы можете использовать функции sine и cosine, чтобы получить относительное движение по осям x и y.

Нравиться:

xPos += speed * Math.sin(movementAngle);
yPos += speed * Math.cos(movementAngle);

Использование приведенных выше (полярных координат) в различных анимациях позволяет легко изменять направление или скорость движения. движения (которые являются переменными speed и movementAngle соответственно). При использовании декартовых координат (позиция x и y) изменение либо скорости, либо направления движения потребует неочевидных изменений как x, так и y.

Формулы в решении выше — не что иное, как преобразование полярных координат в декартовы.

Изменить: чтобы получить более "естественное" поведение, когда movementAngle из 0 означает движение вправо, PI/2 – вверх, PI – влево и 3*PI/2 – вправо, используйте следующее:

xPos += speed * Math.cos(-1*movementAngle);
yPos += speed * Math.sin(-1*movementAngle);
person kamituel    schedule 28.03.2013
comment
Угол движения в радианах или градусах? - person 3D-kreativ; 28.03.2013
comment
@3D-креатив - в случае Math.sin() это радианы. см. документ . - person kamituel; 28.03.2013
comment
Я думаю, это работает, я использую этот код: двойной угол = Math.toRadians(180); xPos += скорость * Math.sin(угол); yPos += скорость * Math.cos(угол); Я просто немного запутался, 180 градусов вверх, я думал 90 градусов вверх!? Использую ли я один и тот же переменный угол как для sin, так и для cos? - person 3D-kreativ; 28.03.2013
comment
@3D-kreativ - для 180 градусов (PI), sin(PI) = 0 и cos(PI) = -1, поэтому xPos не изменяется, а yPos уменьшается, таким образом, движение вверх. Если вы установите угол на 90 градусов (PI/2), вы получите sin(PI/2) = 1 и cos(PI/2) = 0), что будет означать правильное направление. Она называется полярной системой координат. - person kamituel; 28.03.2013
comment
Хммм, значит есть и полярные координаты и декартовы координаты тогда, наверное, мне проще понять декартовы координаты, поэтому тогда я меняю угол. Когда я изучал математику, 0 градусов было вправо и против часовой стрелки 90 градусов вверх, а затем влево 180... - person 3D-kreativ; 28.03.2013
comment
@3D-kreativ - если вы хотите, чтобы угол соответствовал тому, что вы уже знаете из уроков математики, вы всегда можете сделать следующее (в начале): angle = -1 * angle + PI/2. - person kamituel; 28.03.2013
comment
Обычно cos угла дает вам x-часть движения, а sin угла дает вам y-часть движения. Это означает, что направления начинаются с 0 градусов = восток и поворачиваются против часовой стрелки, что является соглашением для направлений. - person Patashu; 28.03.2013
comment
@Patashu, вы правы, возможно, это было бы более понятно, если бы мы думали в декартовых координатах;) Я обновлю ответ. - person kamituel; 28.03.2013