2015-08-16 111 views
0

我有一个基于回合的游戏。在您的轮到时,它会提示您进行移动,并要求您输入一次按键。只要按键被检测到,游戏就会继续,直到下一回合才会提示您。防止GetAsyncKeyState函数在被调用后检测输入吗? C++

虽然使用GetAsyncKeyState函数,但我仍然遇到问题,因为即使在调用它之后它仍存储按键。

从MSDN网站: 确定某个键是否向上或向下的函数被调用,的时间和是否以前调用GetAsyncKeyState后,按下键。

粗体区域是我造成的问题,因为用户可以在不轮到他/她时轮流键入垃圾信息,那么当轮到他/她时,游戏会提示用户并立即确认一个事先按下的输入。

我对这个功能很类似:

unsigned int getUserInput(){ 

while (true) //Await a user's input 
    { 
      if (GetAsyncKeyState(0x31)) 
      { 
       return 1; //User pressed 1 key 
      } 
      else if (GetAsyncKeyState(0x32)) 
      { 
       return 2; //User pressed 2 key 
      } 
      else if (GetAsyncKeyState(0x33)) 
      { 
       return 3; //User pressed 3 key 
      } 
      else if (GetAsyncKeyState(0x34)) 
      { 
       return 4; //User pressed 4 key 
      } 
      else if (GetAsyncKeyState(0x35)) 
      { 
       return 5; //User pressed 5 key 
      } 
      else if (GetAsyncKeyState(0x36)) 
      { 
       return 6; //User pressed 6 key 
      } 
    } 
} 

我应该不会在这种情况下使用ASNC国家重点?如果是这样,什么是更好的选择?

回答

1

GetAsyncKeyState返回的值是一个位字段。您可以通过按位运算来分离正在查找的位。在你的特定情况下(用于检测键是否被按下),你正在寻找高位。你可以这样测试:

if (GetAsyncKeyState(0x31) & 0x8000) 
{ 
    return 1; //User pressed 1 key 
} 

但是,如果我正确理解你的问题描述,我不认为这将完全解决它。听起来好像你希望用户在功能运行时不得不按下按键(而不是只能按住按键)。你应该为此做什么,在功能检查开始时是否按下了键。如果是,等待它被释放。类似这样的:

bool key_is_pressed = true; 
while (key_is_pressed) { 
    key_is_pressed = false; 

    // the key codes you are checking are consecutive, 
    // so we can just loop over them 
    for (int key = '1'; key <= '6'; ++key) { 
     if (GetAsyncKeyState(key) & 0x8000)) 
      key_is_pressed = true; 
    } 
} 

然后继续到等待按键的部分。

请注意,您突出显示的文本“以及在先前调用GetAsyncKeyState”“后是否按下了键,实际上可能是解决您的问题的方法。该信息存储在不同位(低位)中,因此您可以将其隔离并确保以前按下的密钥不是。不幸的是,MSDN清楚地表明不应该依赖这种行为。所以当你使用GetAsyncKeyState时,你应该几乎总是忽略一切。

+0

哇......这让我感觉有点过头了。几个问题:在你的第一个代码块中,0x8000是什么意思,为什么需要那里?在我所有的GetAsyncKeyState调用中,它只是GetAsyncKeyState(参数)调用。 – Hatefiend

+0

@Hatefiend:'0x8000'是一个十六进制数字,它的二进制表示形式是'1000000000000000'。通过将(使用'&')与对'GetAsyncKeystate'的调用结果相结合,您可以屏蔽除最重要位以外的所有内容。其结果是,如果该位为0,则组合的结果为0(在if语句中将其作为“false”),如果该位为“1”,则结果为非零在if语句中比较为'true')。 –

+0

我也应该对我的问题进行更具描述性的描述。有时我会要求用户按下字母键和数字键,空格键等,因此您创建的for循环可能无法工作。真的看完循环之后..它告诉计算机......“好吧,用户按下了按键1?按键2还是按键3?等等。”我不明白这是如何改进的:if(key1 pressed)else if(key2 pressed)等等。我不明白它是如何解决我的问题,即使在函数调用之后,AsycKey仍然监听按键已经制成。 – Hatefiend

相关问题