Jump to content
  • Advertisement
Sign in to follow this  
signal_

[SDL] Keyboard Input Question [Almost Solved, Maybe Not Optimally]

This topic is 3890 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

So I tried searching for the answer on here and on google to no avail. If someone could set me in the right direction, I'd be most appreciative. EDIT: I am using C++ language and the SDL library. For the time being I am using DEVC++ IDE, but am switching to the Microsoft C++ very soon. Objective: in my keyboard handling routine I would like to have the key press 'c' go into "Cursor Mode". Upon pressing 'c' a second time the program user exits "Cursor Mode". "Cursor Mode" is simply a game state where an 'X' is placed on the screen that can be incrementally moved across the game space for purposes of interaction. Code Snippet:
if (SDL_PollEvent(&event)) 
     if( event.type == SDL_KEYDOWN )
         if( event.key.keysym.sym == SDLK_c )
              {
              int cursorMode = 1;
              Cursor cursor;
              cursor.initCursor();

              while (cursorMode == 1)
                   {
                   if (SDL_PollEvent(&event)) 
                       if( event.type == SDL_KEYDOWN )
                           if( event.key.keysym.sym == SDLK_c )
                                cursorMode = 0; //setting to 0 exits cursor mode
                   // do cursor stuff here
                   }
              cursor.~Cursor();          
              }



Discussion of Problem: When the program is running I can press 'c' to get into cursor mode; however, when pressed a second time, I cannot exit out of cursor mode. If I change the second statement from the code [if( event.key.keysym.sym == SDLK_c )] to [if( event.key.keysym.sym == SDLK_d )], the 'd' key press will exit from cursor mode! wtf? I know this is probably a basic problem, but I am a beginner and cannot solve it yet. Please help! I will continue to work on the problem in the mean time. Thanks in advance! [Edited by - signal_ on March 16, 2008 1:22:26 PM]

Share this post


Link to post
Share on other sites
Advertisement
I can't answer your question exactly, but I can guarantee you can avoid a lot of headaches later by separating your logic code from your input code by writing a small wrapper. Doing that will not only solve this problem, but many other potential issues down the road, and make your code a hell of a lot cleaner.

Share this post


Link to post
Share on other sites
Ok. So I solved it. However I am unsure as to whether this solution is optimal. Also, thanks fd9_ for the advice; it is noted and I always appreciate the insight.

I added a check for the cursorMode flag before I enter "Cursor Mode". This seems to solve it.

My theory on what is/was happening: one single keystroke of 'c' satisfied both if statements (the outer and the nested one). This led to the poor outcome of being inexorably stuck in the nested loop. I am still shaky on the understanding, but I should probably "get it" eventually. Also, a proper explanation from any of you smart coders will be appreciated as well.

Best wishes.


UPDATED Code Snippet:



//initialize cursorMode flag
int cursorMode = 1;


if (SDL_PollEvent(&event))
if( event.type == SDL_KEYDOWN )
if( event.key.keysym.sym == SDLK_c && cursorMode == 1) // NOTE CHANGE
{// the above if statement checks the cursorMode flag!!!

Cursor cursor;
cursor.initCursor();

while (cursorMode == 1)
{
if (SDL_PollEvent(&event))
if( event.type == SDL_KEYDOWN )
if( event.key.keysym.sym == SDLK_c )
cursorMode = 0; //setting to 0 exits cursor mode
// do cursor stuff here
}
cursor.~Cursor();
}







EDIT: So I tried some more things and I think I have fully solved the problem. I found an example online. This example said that a common mistake is to handle only the KEYDOWN event and not handling the KEYUP event. Using this knowledge I was able to formulate a suitable solution; maybe not the most optimal, but it works for me.

[Edited by - signal_ on March 16, 2008 5:21:13 PM]

Share this post


Link to post
Share on other sites
You seem to be calling SDL_PollEvent() twice in one loop. Each time you call SDL_PollEvent, it retrieves a different event, so you usually don't want it called twice anywhere in your code.

What you'd want might be simular to this:


Cursor cursor;

while( SDL_PollEvent(&event) )
if( event.type == SDL_KEYDOWN )
{
if( event.key.keysym.sym == SDLK_c)
{
if(cursor.cursorModeIsOn() == true)
cursor.turnCursorModeOff()
else //if(cursor.cursorModeIsOn() == false)
cursor.turnCursorModeOn()
}
}

//Do cursor stuff outside of your event poll.

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.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!