2014-08-30 5 views
0

Я учусь перемещаться по 2D-карте и нуждаюсь в помощи с использованием функций тригонометрии.2D Движение в определенном направлении

Вот мой текущий код.

const Uint8 * key = SDL_GetKeyboardState(NULL); 
    if(key[SDL_SCANCODE_D]){ 
     if(render_arrow){ 
      arrow.Angle(1); 
     } 
    } 
    if(key[SDL_SCANCODE_A]){ 
     if(render_arrow){ 
      arrow.Angle(-1); 
     } 
    } 
    if(key[SDL_SCANCODE_LEFT]){ 
     if(render_arrow){ 
      arrow.set_location(arrow.X_Co() - 1, arrow.Y_Co()); 
     } 
    } 
    if(key[SDL_SCANCODE_RIGHT]){ 
     if(render_arrow){ 
      arrow.set_location(arrow.X_Co() + 1, arrow.Y_Co()); 
     } 
    } 
    if(key[SDL_SCANCODE_UP]){ 
     if(render_arrow){ 
      arrow.set_location(arrow.X_Co(), arrow.Y_Co() - 1); 
     } 
    } 
    if(key[SDL_SCANCODE_DOWN]){ 
     if(render_arrow){ 
      arrow.set_location(arrow.X_Co(), arrow.Y_Co() + 1); 
     } 
    } 

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

Что я знаю, так это то, что есть функция, которая каким-то образом использует коэффициент касательной для вычисления квадранта, с которым вы сталкиваетесь, и дает вам некоторые номера для настройки местоположения. Однако я не знаю функции и как правильно ее использовать.

Что бы я хотел, чтобы иметь возможность сделать это, стрелка перемещается в направлении, указывающем, когда я нажимаю UP, а назад, когда нажимаю DOWN. И чтобы сражаться сбоку с ЛЕВОЙ и ПРАВОЙ. Клавиши A и D используются для поворота угла.

Любые полезные алгоритмы, которые вы, возможно, знаете, будут очень признательны.

Редактировать: Угол (0) возвращает текущий угол.

ответ

1
if(key[SDL_SCANCODE_UP]){ 
    if(render_arrow){ 
     deltaX = AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * cos (arrow.angle()); 
     deltaY = AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * sin (arrow.angle()); 

     arrow.set_location(arrow.X_Co()+deltaX, arrow.Y_Co() +deltaY); 
    } 
} 
if(key[SDL_SCANCODE_DOWN]){ 
    if(render_arrow){ 
                   //Note the -'s 
     deltaX = - AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * cos (arrow.angle()); 
     deltaY = - AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * sin (arrow.angle()); 
     arrow.set_location(arrow.X_Co()+deltaX, arrow.Y_Co() +deltaY); 
    } 
} 

Для получения дополнительной информации о переходе от угла х у координаты см этой страница http://www.mathsisfun.com/polar-cartesian-coordinates.html (прокрутите вниз до «Для преобразования из полярных в декартов»), или Google «конвертировать полярную декартову.»

2

Вы должны прочитать об изменении систем координат. Добавление ответа, поскольку у меня нет 50 рецензий, но не добавляйте это в качестве комментария.

+0

, чтобы дать вам некоторую репутацию;) –

+0

Спасибо за это privilige. :) – Crusher

0

Из того, что я вижу, проблема в том, что вы комбинируете свой код страйфа с кодом направления. Эти два должны быть раздельными. Для обстрела все, что вам нужно сделать, это умножить свою скорость на единичный вектор. Для направления вы умножаете вектор2 (содержащий ваши компоненты cos и sin) на скорость. Вот пример:

// Our unit vectors 
namespace vec 
{ 
    Vector2f UpVec{0.0f, -1.0f}; 
    Vector2f DownVec{0.0f, 1.0f}; 
    Vector2f LeftVec{-1.0f, 0.0f}; 
    Vector2f RightVec{1.0f, 0.0f}; 
} 

if (Keyboard::isKeyPressed(Keyboard::Left)) 
{ 
    player.vel = player.speed * vec::LeftVec; 
} 
if (Keyboard::isKeyPressed(Keyboard::Right)) 
{ 
    player.vel = player.speed * vec::RightVec; 
} 

if (Keyboard::isKeyPressed(Keyboard::Up)) 
{ 
    float angle = player.angle * M_PI/180; 
    Vector2f dir{(float)cos(angle), (float)sin(angle)}; 
    player.vel = player.speed * dir; 
} 
if (Keyboard::isKeyPressed(Keyboard::Down)) 
{ 
    float angle = player.angle * M_PI/180; 
    Vector2f dir{-(float)cos(angle), -(float)sin(angle)};  
    player.vel = player.speed * dir; 
} 

Это использует соз и грех от <cmath> так, что ожидает аргумент в радианах. Тогда вы просто делаете player.position += player.velocity * deltaTime.

+0

Код, который я в настоящее время не предназначен для эмулирования движения, зависящего от угла, описанного выше, просто просто вверх/вниз/влево/вправо с возможностью 45 градусов. Но у меня практически нет знаний о векторах. Я надеялся, что смогу написать функцию, которая будет просто вставлена ​​в структуру if, передав либо указатели на местоположение в функцию, либо изменив их напрямую, либо заменив функции X_Co() и Y_Co() для функции, которая возвращает оси. Что делают векторы? Существуют ли особые преимущества для использования векторов? – Svihuroid

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