我在使用使用getch()的函数重复键检查时遇到问题。
这是一个代码示例:
static char g_keybuffer[256];
_Bool IsKeyDown(char c)
{
char ch;
if(kbhit())
ch = getch();
if(ch == -32 || ch == 224)
{
ch = getch();
}
g_keybuffer[ch] = 1;
if(g_keybuffer[c] == 1)
{
g_keybuffer[c] = 0;
return 1;
}
return 0;
}
/*
*
*/
int main(int argc, char** argv) {
while(1)
{
if(IsKeyDown('a'))
{
printf("Test\n");
}
if(IsKeyDown('a'))
{
printf("Hello\n");
}
else if(IsKeyDown('b'))
{
printf("World\n");
}
Sleep(100);
}
return (EXIT_SUCCESS);
}
我知道问题发生的原因。按下某个键时,每个循环kbhit为真一次,并将ch设置为从缓冲区中检索的字符。当使用IsKeyDown时,如果它等于参数,缓冲区g_keybuffer中的键被设置为等于零,以避免键无限地“向下”。这样做的问题是,如果你想检查同一个键是否多次关闭,只会运行第一个IsKeyDown实例,其余部分由于密钥的g_keybuffer现在为0而无效。
有谁知道如何更改IsKeyDown以使其能够在每次循环时多次检查相同的密钥?我被卡住了。
答案 0 :(得分:0)
您的问题是因为您在获得关键状态的点击后将g_keybuffer[c]
设置为0
。我猜你已经这样做了,以避免两次得到相同的结果 - 但这只是一种解决方法。要做正确的事情的唯一方法是选择一个实际用于捕获键盘状态的库。
大多数图形库都具有捕获键盘状态的功能。如果您只是在编写一个小程序,我不知道有任何解决方案认为不需要一点开销。