Проблемы с 3D / FPS камерой - SDL2

0

У меня проблема с моим кодом, я пытаюсь создать 3D-камеру первого лица. Я использую SDL_GetKeyboardState (NULL), чтобы получить нажатые клавиши.

Когда я нажимаю один из определенных ключей, ничего не происходит, почему?

Камера (Controll):

void Control(float movevel, float mousevel, bool mi, SDL_Window* window)
{
if (mi)  //if the mouse is in the screen
{
    int MidX = 640 / 2;   //middle of the screen
    int MidY = 480 / 2;
    SDL_ShowCursor(SDL_DISABLE);    //we don't show the cursor
    int tmpx, tmpy;
    SDL_GetMouseState(&tmpx, &tmpy); //get the current position of the cursor
    camYaw += mousevel*(MidX - tmpx);   //get the rotation, for example, if the mouse current position is 315, than 5*0.2, this is for Y
    camPitch += mousevel*(MidY - tmpy); //this is for X
    lockCamera();
    //SDL_WarpMouse(MidX, MidY);       //move back the cursor to the center of the screen
    SDL_WarpMouseInWindow(window, MidX, MidY);

    const Uint8* kstate = SDL_GetKeyboardState(NULL);

    if (kstate[SDLK_w])
    {
        if (camPitch != 90 && camPitch != -90)
        {       //if we are facing directly up or down, we don't go forward, it will be commented out, when there will be gravity
            moveCamera(movevel, 0.0);        //move forward
        }

        moveCameraUp(movevel, 0.0);      //move up/down
    }

    if (kstate[SDLK_s])
    {
        //same, just we use 180 degrees, so we move at the different direction (move back)
        if (camPitch != 90 && camPitch != -90)
        {
            moveCamera(movevel, 180.0);
        }

        moveCameraUp(movevel, 180.0);
    }

    if (kstate[SDLK_a])
    {       //move left
        moveCamera(movevel, 90.0);
    }

    if (kstate[SDLK_d])
    {  //move right
        moveCamera(movevel, 270);
    }
}

glRotatef(-camPitch, 1.0, 0.0, 0.0);
glRotatef(-camYaw, 0.0, 1.0, 0.0);
}

Главная (Loop)

while (running)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    SDL_Event ev;
    while (SDL_PollEvent(&ev))
    {
        switch (ev.type)
        {
            case SDL_QUIT:
                running = false;
                break;
            case SDL_KEYDOWN:
                int x, y;

                SDL_GetMouseState(&x, &y);
                Main::handleKeys(ev.key.keysym.scancode, x, y);
                break;
        }
    }

    Main::update(window);
    Main::render(window);

    SDL_GL_SwapWindow(window);
}

Главная (обновление):

void Main::update(SDL_Window* window)
{
Control(0.2, 0.2, mousein, window);
UpdateCamera(0.2); //move the camera to the new location
}
  • 0
    В большинстве случаев вызывать glRotatef в вашем обработчике keayboard - очень плохая идея. Скорее всего, матрицы будут перезаписаны в вашей функции рендеринга.
  • 0
    Я изменил это, Все еще безуспешно: /
Показать ещё 2 комментария
Теги:
camera
opengl
game-engine
sdl-2

2 ответа

1
Лучший ответ

Используйте SDL_PumpEvents() для обновления массива состояний. (Из вики файла SDL_GetKeyboardState()). Я считаю, что если вы это сделаете:

SDL_PumpEvents();
SDL_GetKeyboardState(NULL);

вы должны получить результаты, которые вы ищете. (Вам нужно SDL_PumpEvents каждый цикл, а также SDL_GetKeyboardState, очевидно)

(EDIT) Другой вариант:

    case SDL_KEYDOWN:
        switch(event.key.keysym.sym){
            case SDLK_w
                (... code)
                break;
            case SDLK_s:
                (... code)
                break;
            case SDLK_a:
                (... code)
                break;
            case SDLK_d:
                (... code)
                break;

Вы также можете отправить event.key.keysym.sym в функцию и использовать ее в своих целях.

  • 0
    Спасибо, но по какой-то причине он ничего не сделал, он не изменился: / Idk, почему, но может быть другой способ получить ввод с клавиатуры? (Без глютена)
  • 0
    Это должно работать! Можете ли вы показать мне код handleKeys ()? Я оставил тебе другой способ сделать это, если это поможет.
Показать ещё 5 комментариев
2

вы должны вызвать функции glRotatef перед тем, как перевести камеру, иначе она будет повернута относительно начала координат, а не его положения

  • 0
    Ну, по какой-то причине это не проблема, когда я связываю камеру с обработчиком событийной клавиатуры, она работает нормально (единственная проблема - я не могу нажать несколько клавиш и удерживать их.) Но когда я делаю это, использую 'SDL_GetKeyboardState «Это ничего не делает. Я изменил это, кстати, спасибо: D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню