Проблемы с повторной проверкой ключей с помощью 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 после того, как вы получили удар по ключевому состоянию. Я предполагаю, что вы сделали это, чтобы избежать получения одного и того же результата дважды - но это всего лишь обходной путь. Единственный способ сделать то, что вы хотите сделать правильно, - это выбрать библиотеку, которая фактически сделана для записи состояния клавиатуры.

Большинство графических библиотек имеют функции для захвата состояний клавиатуры. Я не знаю ни одного решения, которое не требовало бы небольших накладных расходов, если вы просто пишете небольшую программу.

Другие вопросы по тегам