我正在学习使用kbhit()GetAsyncKeyState()getch()的组合来构建控制台游戏。

我使用的是Visual Studio 2010 Express,我可以使用c / c ++标头。

兼容性问题(仅在Windows平台上运行)对我而言并不重要。

看一下这个简单的代码:

#include<stdio.h>
#include<conio.h>
#include<Windows.h>

int main()
{
  printf("Welcome\n");
  while(true)
  {
    if(_kbhit())
    {
      if(GetAsyncKeyState(VK_UP))
        printf("UP\n");
      else if(GetAsyncKeyState(VK_DOWN))
        printf("DOWN\n");
      else if(GetAsyncKeyState(VK_LEFT))
        printf("LEFT\n");
      else if(GetAsyncKeyState(VK_RIGHT))
        printf("RIGHT\n");
      else
        printf("NOT ARROW\n");
      getch();
    }
  }
  return 0;
}


问题是:任何虚拟键输入都将输出TWICE,而其他键运行正常。

我不知道出了什么问题,但是我发现很容易解决。

#include<stdio.h>
#include<conio.h>
#include<Windows.h>

int main()
{
  printf("Welcome\n");
  while(1)
  {
    if(_kbhit())
    {
      if(GetAsyncKeyState(VK_UP))
      {
        printf("UP\n");
        _getch();
      }
      else if(GetAsyncKeyState(VK_DOWN))
      {
        printf("DOWN\n");
        _getch();
      }
      else if(GetAsyncKeyState(VK_LEFT))
      {
        printf("LEFT\n");
        _getch();
      }
      else if(GetAsyncKeyState(VK_RIGHT))
      {
        printf("RIGHT\n");
        _getch();
      }
      else
      {
        printf("NOT ARROW\n");
      }
      _getch();
    }
  }
  return 0;
}


我的猜测是GetAsyncKeyState()没有正确清除为默认值

有什么解释吗?

还为每个_getch()kbhit()添加GetAsyncKeyState()是一种冗余,因此会降低可读性,还有其他选择吗?

最佳答案

(GetAsyncKeyState(VK_UP)&1)

关于c++ - 将GetAsyncKeyState()重置为默认值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39933549/

10-11 23:08