SDL 2.0 handling keyboard input ( onkeydown, onkeypressed, onkeyup, onkeyreleased)

Started by
3 comments, last by Symphlion 10 years, 4 months ago

Hello there!

New to the forums, though i`ve been skimming these forums for a while now! FIY I`m new with C++ and totally new with SDL2.

In any case, I`m trying to achieve something which roughly translates to the following use case: Handling keyboard input with SDL2.

So imagine the following cpp:


Player::Update( float dt) {
    if(Input::OnKeyDown("w")){
          /// move player up (or jump w/e)
    }
}


All valid, correct? This is not the hardest part, I can read the current input using SDL_GetKeyboardState(NULL) and my Input class directly reads the returned array to check if the given key was set to 1.

However, I`m also looking for a way to register single key strokes. So, instead of plainly checking if a button is DOWN, I need to differentiate. What I would like to achieve is this; how do I check whether the previous state was UP and the current state is DOWN?

The SDL_GetKeyboardState() returns a pointer to an array which I can use to retrieve information, however I have no clue how to store that array some place else.

Basically, what i`m looking for is something like this ( using SDL_PumpEvents())


// somewhere in the update function of input
SDL_pumpEvents();

oldKeyboardState = currentKeyboardState;
currentKeyboardState = nextKeyboardState;
* nextKeyboardState = < the pointer to the SDL keyboard array>;

I`m not sure, but if I manage to get this working, it should be fairly easy to check whether the previous state was 0 and the current state was 1 correct?

Any tips/pointers(ugh..) to help me out? Any and all help will be much appreciated!

Advertisement

This might help you: http://www.gamedev.net/blog/355/entry-2250186-designing-a-robust-input-handling-system-for-games/

SDL already provides this in the basic SDL_PollEvent loop. Alternatively, you could maintain your own array of the previous keystates (size SDLK_LAST) and copy (using a loop, std::fill, std::memcpy, whatever) the current values once per frame. Where the values of the same index in the arrays differ, you have an event, and by looking at the relative values you can determine whether it was a key press or release.

I would like to try the alternative, since looping trough all the events seems that you have to individually handle all keystrokes in the code, which would severy limit extensibility or am I wrong in assuming that?

Either way, I would like to learn more about copying the currentstate variable to the oldstate. Thank you for the help, how do I go about using for example the std::memcpy or std::fill? Furthermore, will this help solve the issue at hand? Or am I looking in the wrong direction?

Solved it! I copied the array, however there was no change, so all I had to do was set the PumpEvents() after the copying.


const Uint8 * currentKeyState;
// shouldn`t be a const
Uint8 * oldKeyState;

//Constructor
currentKeyState = SDL_GetKeyboardState(&this->length);
oldKeyState = new Uint8[this->length];

//Input update
memcpy(oldKeyState, currentKeyState, this->length);
SDL_PumpEvents();
currentKeyState = SDL_GetKeyboardState(NULL);

This topic is closed to new replies.

Advertisement