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);
}
}

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

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

То, что я хотел бы сделать, это сделать так, чтобы стрелка двигалась в направлении, которое она указывает, когда я нажимаю ВВЕРХ, и назад, когда я нажимаю ВНИЗ. И перешагнуть из стороны в сторону с левым и правым. Клавиши A и D используются для поворота угла.

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

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

0

Решение

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);
}
}

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

1

Другие решения

Судя по тому, что я вижу, проблема в том, что вы комбинируете свой код Strafe с вашим кодом направления. Два должны быть отдельными. Для стрельбы все, что вам нужно сделать, это умножить вашу скорость на единичный вектор. Для направления вы умножаете Vector2 (содержащий ваши компоненты 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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector