Jump to content

  • Log In with Google      Sign In   
  • Create Account


Problem with Key presses in SDL 2.0


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
6 replies to this topic

#1 Chris528   Members   -  Reputation: 186

Like
1Likes
Like

Posted 14 October 2013 - 04:10 AM

Hi, I'm currently working on a model viewer and I've come across an have issue that's driving me crazy. I wanted to toggle backface culling with the number 3 key, so I went ahead and and implemented it. But my problem is that the keydown event is triggered for as long as I'm holding the key down, which means that pressing the 3 key for about a half second toggles backface culling about 20 times. Do i somehow reset the key after It is pressed so It is no longer active on the next frame even if its still being pressed? If so how would I accomplish that? The SDL 2 documentation seems pretty useless in this regard, and I haven't been able to find any useful info anywhere else.



Sponsor:

#2 BitMaster   Crossbones+   -  Reputation: 3784

Like
1Likes
Like

Posted 14 October 2013 - 07:47 AM

The typical way to deal with that would be to keep the state of the key around as a simple boolean (true means the button is pressed, false means it is released). The button was only pressed if you receive a press event and the state is false, otherwise it's just repeat messages.

I'm not familiar enough with SDL but at least GLFW allows you to configure whether you want to get repeat messages. However, if you intend to do any text input it would be advisable to leave it in.

#3 krinosx   Members   -  Reputation: 499

Like
0Likes
Like

Posted 14 October 2013 - 12:35 PM

Humm when are you trying to deal with state changes, and when you try to use the KEY_EVENT from a keyboard, its a good practice to use the KEY_UP event... so, the event will only be registered when the user release the key....

 

The KEY_DOWN is used, normally, when you want to track the action... like... 'put the char moving while the key is pressed'.. in this case.. use key_down.. otherwise, use key_up....

Something like it:

 while (!quit){ 
                while (SDL_PollEvent (&eventQueue)) { 
             
           if (eventQueue.type == SDL_QUIT) {
              quit = true; 
           } else if (eventQueue.type = SDL_KEYUP){ 
               switch (eventQueue.key.keysym.sym){ 
                        case SDLK_3: activate_anything();break; 
                        case SDLK_4: activate_otherthing();break; 
               } 
           } 
 } 

You may create a bool variable to track the state of your 'backface culling'...

 

So when the key_3 is released you set it to true, nex time set it to false... 

 

 

Thats the idea...

 

(sry about my english.. its not so good )



#4 Chris528   Members   -  Reputation: 186

Like
1Likes
Like

Posted 14 October 2013 - 01:18 PM

You may create a bool variable to track the state of your 'backface culling'...

 

So when the key_3 is released you set it to true, nex time set it to false... 

 

 

Thats the idea...

 

(sry about my english.. its not so good )

Thanks, but that's how i had already coded it. otherwise it wouldn't have toggled at all. Here's my current code, I'm just not sure where to go from here http://privatepaste.com/990f8f54f7



#5 krinosx   Members   -  Reputation: 499

Like
0Likes
Like

Posted 14 October 2013 - 02:44 PM

I cant view your code from my work ( internet restricted here ).

 

Well.. you can try a following approach:

 

1 - When you first detect the KEY_DOWN event, toggle a boolean variable to 'true'...

2 - When you detect the event of KEY_UP toggle the boolean to false....

 

something like it:

boolean isActive = false;
 while (!quit){ 
                while (SDL_PollEvent (&eventQueue)) { 
             
           if (eventQueue.type == SDL_QUIT) {
              quit = true; 
           } else if (eventQueue.type = SDL_KEYDOWN){ 
               switch (eventQueue.key.keysym.sym){ 
                        case SDLK_3:
                              if( !isActive ) {
                                isActive = true 
                                activate_culling();
                              }
                          break; 
               } 
           } else if (eventQueue.type = SDL_KEYUP){ 
               switch (eventQueue.key.keysym.sym){ 
                        case SDLK_3: 
                           if( isActive ) {
                              isActive = false;
                              deactivate_culling();
                           }
                         break; 

               } 
           } 
 } 

This way you will call your activate_culling() function the first time the key_down event is registered and will deactivate it when the key_3 is released...

 

Can you figure it out?

 

[]´s



#6 Chris528   Members   -  Reputation: 186

Like
0Likes
Like

Posted 14 October 2013 - 04:31 PM

I cant view your code from my work ( internet restricted here ).

 

Well.. you can try a following approach:

 

1 - When you first detect the KEY_DOWN event, toggle a boolean variable to 'true'...

2 - When you detect the event of KEY_UP toggle the boolean to false....

 

something like it:

boolean isActive = false;
 while (!quit){ 
                while (SDL_PollEvent (&eventQueue)) { 
             
           if (eventQueue.type == SDL_QUIT) {
              quit = true; 
           } else if (eventQueue.type = SDL_KEYDOWN){ 
               switch (eventQueue.key.keysym.sym){ 
                        case SDLK_3:
                              if( !isActive ) {
                                isActive = true 
                                activate_culling();
                              }
                          break; 
               } 
           } else if (eventQueue.type = SDL_KEYUP){ 
               switch (eventQueue.key.keysym.sym){ 
                        case SDLK_3: 
                           if( isActive ) {
                              isActive = false;
                              deactivate_culling();
                           }
                         break; 

               } 
           } 
 } 

This way you will call your activate_culling() function the first time the key_down event is registered and will deactivate it when the key_3 is released...

 

Can you figure it out?

 

[]´s

The problem is that i have my input extracted into a class and the code is shared with multiple projects. Which means i shouldn't add project specific stuff to it. I need to somehow extend my input class.



#7 krinosx   Members   -  Reputation: 499

Like
0Likes
Like

Posted 15 October 2013 - 07:41 AM

Hummm I cant figure out the problem....

 

The original problem is not about handling the 'toggle' feature on getting the key_down event??

May you show us some of your code? so we can try to help??






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