gpt4 book ai didi

c++ - 阻止 GetAsyncKeyState 函数在调用后检测输入? C++

转载 作者:行者123 更新时间:2023-11-28 06:07:42 24 4
gpt4 key购买 nike

我有一款回合制游戏。轮到您时,它会提示您移动并要求您输入一键输入。一旦检测到按键,游戏就会继续,并且在下一轮之前不会再提示您。

我在使用 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 Key State 吗?如果是这样,什么是更好的选择?

最佳答案

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 位以外的所有内容。

关于c++ - 阻止 GetAsyncKeyState 函数在调用后检测输入? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32032193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com