を組み合わせて使用し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;
}
問題は、仮想キー入力が 2 回表示され、他のキー入力が正常に実行されることです。
何が問題なのかわかりませんが、簡単な修正方法を見つけました。
#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()
for everykbhit()
を追加するとGetAsyncKeyState()
一種の冗長性があるため、可読性が低下します。代替手段はありますか?