Problem with Key presses in SDL 2.0

Started by
5 comments, last by KrinosX 10 years, 6 months ago

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.

Advertisement
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.

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 )

KrinosX

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

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

KrinosX

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.

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??

KrinosX

This topic is closed to new replies.

Advertisement