2014-11-11 2 views
0
if(wIsPressed){ 
    movement.x += sin((player.getRotation() * 3.141592654)/ 180) * .5; //accelerates ship at a rate of 0.5 ms^2 
    movement.y -= cos((player.getRotation() * 3.141592654)/ 180) * .5; //accelerates ship at a rate of 0.5 ms^2 

} 
else if(abs(movement.x) > 0 || abs(movement.y) > 0){ 
    double angle = (atan2(movement.x, movement.y) * 3.141592654)/180; //finds angle of current movement vector and converts fro radians to degrees 


    movement.x -= sin((angle)) * 0.5; //slows down ship by 0.5 using current vector angle 
    movement.y += cos((angle)) * 0.5; //slows down ship by 0.5 using current vector angle 



} 

В основном, что происходит после использования этого кода, так это то, что мой корабль тянут прямо вниз в нижней части экрана и действует как земля с гравитацией, и я не понимаю, что делаю неправильноSFML atan2 Функция и торможение

+0

Вы не преобразовывая свой угол в градусы правильно. Это должно быть: double angle = atan2 (movement.x, movement.y) * 180/3.141592654; – Julian

+0

делает atan2 возвратом радианов или градусов? – user3500457

+0

Все триггерные функции ожидают и возвращают радианы. – Julian

ответ

0

выработать на мой комментарий:

Вы не преобразующего свой угол в градусы правильно. Оно должно быть:

double angle = atan2(movement.x, movement.y) * 180/3.141592654; 

Однако, вы используете этот угол в другом расчете тригов и C++ Триг функции ожидать радианы, так что вы действительно не должны преобразовать это в градусы в первую очередь. Ваш еще если заявление также может быть причиной проблемы, потому что вы проверяете для абсолютного значения больше 0. Попробуйте что-то вроде этого:

float angle = atan2(movement.x, movement.y); 
const float EPSILON = 0.01f; 

if(!wIsPressed && abs(movement.x) > EPSILON) { 
    movement.x -= sin(angle) * 0.5; 
} 
else { 
    movement.x = 0; 
} 

if(!wIsPressed && abs(movement.y) > EPSILON) { 
    movement.y += cos(angle) * 0.5; 
} 
else { 
    movement.y = 0; 
} 
+0

, когда я делаю это изменение, корабль перемещается на дно экрана, а затем снова возвращается к вершине – user3500457

+0

Это сработало! единственное, что мне пришлось изменить, было: movement.y + = cos (angle) * 0.5; to movement.y - = cos (угол) * 0,5; и значение epsilon до 0,4f – user3500457

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