Как двигаться относительно угла? - PullRequest
0 голосов
/ 04 марта 2012

Я постоянно смотрю в интернете, как переместиться из точки А в точку Б на угол с заданным расстоянием. Однако, когда я попытался закодировать его, камера просто испортилась, и я двигаюсь в случайных направлениях. Я использую SDL / OpenGL с C ++, и это моя функция проигрывателя. Сейчас я пытаюсь заставить игрока двигаться вперед по углу.

void player_action()
{

    if (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_MOUSEMOTION:
                {
                    player.rotxl = (screen->w)/2;
                    player.rotxd = event.motion.x - player.rotxl;
                    player.rotx = player.rotx + (player.rotxd/4);
                    if (player.rotx < 0)
                    {
                        player.rotx = player.rotx + 360;
                    };
                    if (player.rotx > 360)
                    {
                        player.rotx = player.rotx - 360;
                    }
                };
            break;

            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_w:
                        {player.zvel = 8.0f;}; break;
                    case SDLK_a:
                        {player.xvel = 8.0f;}; break;
                    case SDLK_s:
                        {player.zvel = -8.0f;}; break;
                    case SDLK_d:
                        {player.xvel = -8.0f;}; break;
                    case SDLK_ESCAPE:
                        {running = false;}; break;
                    default: break;

                }; break;

            case SDL_KEYUP:
                switch(event.key.keysym.sym)
                {
                    case SDLK_w:
                        {player.zvel = 0.0f;}; break;
                    case SDLK_a:
                        {player.xvel = 0.0f;}; break;
                    case SDLK_s:
                        {player.zvel = 0.0f;}; break;
                    case SDLK_d:
                        {player.xvel = 0.0f;}; break;
                    default: break;
                };
            break;
        };

    };

    player.x = player.x + float(player.zvel*cos((double)player.rotx));
    player.z = player.z + float(player.zvel*sin((double)player.rotx));

    glRotatef(player.rotx, 0.0f, 1.0f, 0.0f);
    glTranslatef(player.x, player.y, player.z);

    SDL_WarpMouse((screen->w/2), (screen->h/2));
};

Ответы [ 2 ]

1 голос
/ 04 марта 2012

Если я прав, математические функции sin и cos принимают углы в радианах, не градуса, как кажется player.rotx.Попробуйте следующее:

player.x = player.x + float(player.zvel*cos((double)player.rotx*0.0174532925));
player.z = player.z + float(player.zvel*sin((double)player.rotx*0.0174532925));

Мы умножаем player.rotx на pi/180, то есть как мы конвертируем градусы в радианы.

Не уверен, что это ваша единственная проблема, ноэто, безусловно, один из них.

0 голосов
/ 04 марта 2012

Я вижу два возможных источника проблемы:

  1. Стандартная функция C ++ cos / sin принимает функцию в радианах вместо градусов (один радиан = 180 / pi градусов).
  2. Хотя я не знаком с SDL, быстрый взгляд на документы заставляет меня думать, что вы должны использовать event.motion.xrel вместо .x.Вам придется изменить свой расчет Rotx, который не должен иметь ширину экрана.
...