user3195897
user3195897

Reputation: 181

SDL_GetKeyboardState not working

I am trying to make a controller for a game with SDL 2(didn't want to ask on gamedev since it is not a game issue directly) I use SDL_GetKeyboardEvent to see if the navigation arrows are being pressed but it apparently doesn't work, it is supposed to print a value 1 or -1 if one of those keys is pressed but it doesn't it just prints 0 even if I hold the key down for several seconds, it is like it doesn't detect that the key is being pressed. I searched all over the internet and this is how they do it, but it doesn't work for me.

#define SDL_MAIN_HANDLED
#include <stdio.h>
#include "SDL.h"

/* I'll add some code later
so something that isn't used
might be initialized
*/
int main (void)
{
    int a = 1;
    int x;
    int z;
    SDL_Event quit;
    const Uint8 *keys = SDL_GetKeyboardState(NULL);

    SDL_Init(SDL_INIT_VIDEO);

    while(a)
    {
        SDL_PollEvent(&quit);
        if(quit.type == SDL_QUIT)
            a = 0;

        if(keys[SDL_SCANCODE_UP])
            z = 1;
        else if(keys[SDL_SCANCODE_DOWN])
            z = -1;
        else
            z = 0;
        if(keys[SDL_SCANCODE_LEFT])
            x = -1;
        else if(keys[SDL_SCANCODE_RIGHT])
            x = 1;
        else
            x = 0;
        printf("%d, %d\n", x, z);
//This is supposed to print
//x, z values so if up arrow is pressed it will print 0, 1 and if
//down arrow is pressed it will print 0, -1: the same with horizontal ones.
//1 or -1, 1 or -1
    }

    SDL_Quit();
    return 0;
}

Upvotes: 2

Views: 11786

Answers (3)

Rokas Višinskas
Rokas Višinskas

Reputation: 543

You'll need to create a window with SDL_SetVideoMode to get mouse and keyboard events.

Upvotes: 1

LastBlow
LastBlow

Reputation: 707

Here is my InputManager update function that updates the user input from the keyboard and mouse. Notice the const_cast needed to be able to update the class variable Uint8* keysArray;. This way, more than one event can be processed at once.

    void update() {
        SDL_PumpEvents();

        // update keyboard state
        keysArray = const_cast <Uint8*> (SDL_GetKeyboardState(NULL));

        if (keysArray[SDL_SCANCODE_RETURN])
            printf("MESSAGE: <RETURN> is pressed...\n");
        if (keysArray[SDL_SCANCODE_RIGHT] && keysArray[SDL_SCANCODE_UP])
            printf("MESSAGE: Right and Up arrows are pressed...\n");

        // update mouse location and button states
        SDL_GetMouseState(&x, &y);
        getMouseButtonStates();
}

Upvotes: 0

user2709465
user2709465

Reputation:

Read the documentation: wiki

Note: This function gives you the current state after all events have been processed, so if a key or button has been pressed and released before you process events, then the pressed state will never show up in the SDL_GetKeyboardState() calls

What it means is?

You need to process all events. How? Looping the PollEvent, after the loop (or if you want to check in the loop, check at the end), the SDL_GetKeyboardState is usable.

So, go through the loop, check for keyboards states. Do not forget to always go through the loop before checking for keys

e.g.

while (game)
    {
        /*! updates the array of keystates */
        while ((SDL_PollEvent(&e)) != 0)
        {
            /*! request quit */
            if (e.type == SDL_QUIT) 
            { 
                game = false;
            }
        }

        if (keys[SDL_SCANCODE_RIGHT])
            std::cout << "Right key";
    }

Upvotes: 1

Related Questions