Jump to content

  • Log In with Google      Sign In   
  • Create Account


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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 Symphlion   Members   -  Reputation: 108

Like
0Likes
Like

Posted 01 December 2013 - 09:24 AM

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!

 



Sponsor:

#2 SonicD007   Members   -  Reputation: 457

Like
1Likes
Like

Posted 01 December 2013 - 11:59 AM

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

 



#3 rip-off   Moderators   -  Reputation: 7660

Like
1Likes
Like

Posted 01 December 2013 - 05:12 PM

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.



#4 Symphlion   Members   -  Reputation: 108

Like
0Likes
Like

Posted 01 December 2013 - 05:43 PM

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?



#5 Symphlion   Members   -  Reputation: 108

Like
1Likes
Like

Posted 02 December 2013 - 01:39 PM

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





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS