2013-03-28 2 views
4

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

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

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

ответ

4

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

Как:

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

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

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

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

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

Является ли движение угол в радианах или градусах? –

+0

@ 3D-креатив - в случае 'Math.sin()' это радианы. [См. Документ] (http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html#sin (double)). – kamituel

+0

Я думаю, что это работает, я использую этот код: double angle = Math.toRadians (180); xPos + = скорость * Math.sin (угол); yPos + = скорость * Math.cos (угол); Я просто немного смущен, 180 градусов вверх, я думал, что 90 градусов поднялись !? Использую ли я один и тот же переменный угол как в sin, так и в cos? –

 Смежные вопросы

  • Нет связанных вопросов^_^