Jump to content
  • Advertisement
Sign in to follow this  
Ancient Spirit

A Menu Question....

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

I wrote a program, here is a bit of it: case WM_KEYDOWN: if(wParam == VK_DOWN) { glm.menu_index += 1.0f; if(glm.menu_index == 4.0) glm.menu_index = 0.0; } if(wParam == VK_UP) { glm.menu_index -= 1.0f; if(glm.menu_index == -1.0) glm.menu_index = 3.0; } if(wParam == VK_RETURN) if(glm.menu_index == 3.0) PostQuitMessage(0); break; Now the question is... When i move the cursor with the keboard it moves toooo fast... which kinda makes me miss the menu selection i need... it is annoying... is there anyway to fix it without Sleep(); ??? Basically i need a slower reaction when i press those buttons in the menu... Thanks in advance! Spirit.

Share this post


Link to post
Share on other sites
Advertisement
Guest Anonymous Poster
it looks like all of your movement is based on constant values. it could process a VK_UP message hundreds of times a second (depending on how fast your computer is ). because this isnt based on movement, but selection, a flag for each button could help. something like this



if ( wParam == VK_UP )
{
//make sure the button wasnt pressed on the last iteration
if ( !upFlag )
{
//do up stuff here
}

//we dont care what happened the last iteration, if it was
//up or down, its now been pressed, so keep this true until
// if(wParam==VK_UP) returns false
upFlag = true;
}
else
{
//not pressed, so now the next time the if statement evaluates to true
//(which is the next time you press the button down) it will do your
//menu stuff
upFlag = false;
}




this way, it will only move once per button press. if you wanted it to move as the button is being held down, that is a little more complicated, i could give some psuedo code for that if that is what are you aiming for. hopefully this will do what you want.

Share this post


Link to post
Share on other sites
Thanks that is good... But a new problem bornes... I can't scroll down the menu many time if the key is down... I have to press it 3 times if i want to go down or up, but i want it to be able to do this with one click... Only slower :)

Share this post


Link to post
Share on other sites
Right which is what i was thinking you may have wanted. If you can, do something like this:



static const int SCROLL_MILLI = 50;

....

float timeHeld = 0;

///

if ( wParam == VK_UP )
{
if ( !upFlag || timeHeld >= SCROLL_MILLI )
{
timeHeld = 0;//reseting our counter

//do our menu stuff
}

//increments the time held
timeHeld += GetTickCount();// GetTickCount or equivalent timing method

upFlag = true;
}
else
{
upFlag = false;
timeHeld = 0;//resets counter
}





what this should do, with some tweaking ( i havent tested it ) is that it will move the menu item instantly the first time it was pressed, then wait 50 milliseconds (half a second) before doing it again, and so on.. and so on. if you want, you can change the response time, or can even make the response time faster (ie smaller) with each successive menu movement, like making SCROLL_MILLI not a constant, and where you do the menu stuff, do like a SCROLL_MILLI -= 15, and where you set the upFlag to false, reset SCROLL_MILLI to its default value.

hopefully this gives you the flexibility you need. if this codes work (it might even compile), let me know.

Share this post


Link to post
Share on other sites
Oh, well then just add a timer to it.
Every time you flick to a new menu option, you set a egg-clock to half a second. Whenever you try to flick to a new option, before actually selecting th new thing you check if the egg-clock is still running.

Something like this:
case WM_KEYDOWN:
if((wParam == VK_DOWN) && (GetCurrentTime() > timer)) // check if timer is up yet
{
glm.menu_index += 1.0f;
if(glm.menu_index == 4.0)
glm.menu_index = 0.0;
timer = GetCurrentTime() + 500 // set the timer to half a second into the future
}

if((wParam == VK_UP) && (GetCurrentTime() > timer)) // check if timer is up yet
{
glm.menu_index -= 1.0f;
if(glm.menu_index == -1.0)
glm.menu_index = 3.0;
timer = GetCurrentTime() + 500 // set the timer to half a second into the future
}



This doesnt move your selection until 500 milliseconds have passed since the last time you moved the selection.
How you get the current time is up to you. It depends on what libraries you are using. Usually graphic libraries include such a function, and lots of others do as well.

Share this post


Link to post
Share on other sites
If you respond only to WM_KEYDOWNs, the autorepeat function will kick in and you won't ever have to worry about timers. This is the standard way to handle key holds in windows. That timer method is messy and if you plan on using it, then it should at least be encapsulated in an input manager.

Share this post


Link to post
Share on other sites
hehe, beat you with a similar answer by 50 seconds. i don't like using windows messaging (direct input anyone?) so im not familiar with the messages and their behavoirs, but either way, skittleo is probably right.

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!