Проблемы с повторной проверкой ключей с помощью getch()
У меня проблемы с повторяющейся проверкой ключа с помощью функции, которая использует 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 имеет значение true один раз за цикл и устанавливает ch для символа, полученного из буфера. Когда используется IsKeyDown, если он равен параметру, ключ в буфере g_keybuffer устанавливается равным нулю, чтобы избежать бесконечного "выключения" ключа. Проблема в том, что если вы хотите проверить, не выключен ли один и тот же ключ более одного раза, будет запущен только первый экземпляр IsKeyDown, а остальные будут недействительными, поскольку g_keybuffer ключа теперь равен 0.
Кто-нибудь знает, как я могу изменить IsKeyDown, чтобы дать ему возможность проверять один и тот же ключ несколько раз за цикл? Я застрял.
1 ответ
Ваша проблема в том, что вы настраиваете g_keybuffer[c]
в 0
после того, как вы получили удар по ключевому состоянию. Я предполагаю, что вы сделали это, чтобы избежать получения одного и того же результата дважды - но это всего лишь обходной путь. Единственный способ сделать то, что вы хотите сделать правильно, - это выбрать библиотеку, которая фактически сделана для записи состояния клавиатуры.
Большинство графических библиотек имеют функции для захвата состояний клавиатуры. Я не знаю ни одного решения, которое не требовало бы небольших накладных расходов, если вы просто пишете небольшую программу.