0

我正在学习使用和的组合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;
}

问题是:任何虚拟键输入都会打印两次,而其他的运行正常。

我不知道是什么问题,但我找到了简单的解决方法。

#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()是一种冗余,因此会降低可读性,还有其他选择吗?

4

1 回答 1

0

(GetAsyncKeyState(VK_UP) & 1 )

于 2016-10-11T06:55:50.597 回答