- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一款回合制游戏。轮到您时,它会提示您移动并要求您输入一键输入。一旦检测到按键,游戏就会继续,并且在下一轮之前不会再提示您。
我在使用 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/
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我刚开始玩游戏模组,但遇到了瓶颈。我实际上是一名 C++ 程序员,但我目前所做的 retrofit 要求我使用 C#,这应该不是什么大问题,但我相当确定我错过了一些关键的 C# 概念。 我正在尝试将“
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我编写了一个使用 GetAsyncKeyState() 的小程序,它本身工作得很好。 问题是,当我运行某个外部应用程序(不是我的)时,我的 GetAsyncKeyState() 完全停止接收输入。我希
这是我的代码目前的样子: if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(0x31)) { //... }
我正在尝试使用 C++ 进行学习和实验,到目前为止它是这样的: int main() { std::vector lines = { "Fancy Centered Text!
我是 C++ 的新手,因为我对 Java/Python 等更有经验。但是,我一直在尝试实现一个简单的 Trigger Bot,但添加了一个故障保护,这样如果我按下某个键,程序将调用 exit(0) 方
在我编写的程序中,当我按下“退出”键时,我希望它立即注册,即使在 sleep 期间也是如此。目前它在注册按键之前等到 sleep 语句结束。休眠时间对程序来说很重要,所以不是随便加个暂停等待用户输入就
我正在使用 Windows.h 库的 GetAsyncKeyState 函数来定义按下键盘上的哪个键。例如,这是返回按下的键的 int 值的程序。 #include #include using
所以我正在制作一款在控制台上运行的游戏。我从一些功能开始,以便更轻松地在屏幕上绘图,并且效果很好。然后,当我尝试添加输入(使用函数 GetAsyncKeyState)时,程序一启动程序就崩溃了。它说:
所以我决定今晚要写一个小键盘记录器,只是为了了解 getAsyncKeyState。我试图让我的日志写入一个文件,但文件的内容要么显示为空白,要么向我抛出一个随机内存地址(之前为 0x28fef0)。
我调查了GetAsyncKeyState在关于如何通过 WASD 键使虚构角色在屏幕上移动的代码示例中看到它之后。 我在它的 MSDN 页面上读到了这个: Return value Type: SHO
我正在尝试用 C++ 制作一个基本的控制台游戏,当我尝试在以下代码中使用 GetAsyncKeyState 时: if(GetAsyncKeyState(VK_UP) != 0){
我有 2 个简单的表单,Form1 和 Form2 (Delphi 7)。 Form1 打开 Form2,我在那里等待特定的组合键 (Ctrl + F2)。一旦我关闭 Form2 并返回到 Form1
我正在尝试做一个滚动菜单。我的问题在于 GetAsyncKeyState(VK_RETURN) 我输入信息后,没有返回到我的菜单。它突然要求我输入另一个信息(这是无穷无尽的)。 我不确定它是否与 Ge
我正在学习使用 kbhit() 的组合, GetAsyncKeyState()和getch()构建我的控制台游戏。 我使用的是 Visual Studio 2010 Express,C/C++ hea
我在 AllocConsole() 之间有一些 std::cout 和 std::cin 命令;和 FreeConsole();,但是当我按下 ctrl + caps lock 时,控制台只是短暂地闪
抱歉,如果标题有点令人困惑,但我正在尝试使用值为 12 的 DWORD,并将其与 GetAsyncKeyState 一起使用。 #include #include int x, y; void c
嗨,我是 C++ 的新手,我正在寻找函数 GetAsyncKeyState,我做了一个小应用程序来获取“A”和“B”键,如果在名为 log.txt 的文件中按下,它工作正常,但我有一个问题: 我添加了
我在 MFC 应用程序中使用 GetAsyncKeyState 来检查是否按下了 Esc 按钮,但是当我在对话框中按下 Esc 按钮并在不同的对话框中使用 GetAsyncKeyState 时,它返回
我是一名优秀的程序员,十分优秀!