Advertisement Jump to content
Sign in to follow this  
Symphlion

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

This topic is 1871 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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!

 

Share this post


Link to post
Share on other sites
Advertisement

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.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!