防止GetAsyncKeyState函数在调用后检测输入?c++

Prevent GetAsyncKeyState function from detecting inputs after it is called? C++

本文关键字:检测 输入 c++ 调用 GetAsyncKeyState 函数 防止      更新时间:2023-10-16

我有一款回合制游戏。在轮到你的时候,它会提示你移动,并要求你按下一个键。只要检测到按键,游戏就会继续,直到下一个回合才会提示你。

我有问题,虽然与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密钥状态吗?如果是这样,有什么更好的选择吗?

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时,你应该忽略除hi位之外的所有内容。