Как я могу опрашивать ввод с клавиатуры в c? - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь сделать простую игру для терминала Unix, написанную на c. Я искал способ опроса клавиатуры, но не повезло.

В настоящее время я использую функцию ncurses getch (). Он работает нормально, но если пользователь удерживает клавишу, повторение клавиатуры займет некоторое время, а также остановится, если будет нажата любая другая клавиша. Это вызывает проблемы при игре (особенно в режиме двух игроков, когда обе игры управляются из одного потока ввода).

Например, если игрок 1 удерживает «a», а игрок 2 удерживает «b», мне нужно опросить клавиатуру и обработать поток ввода следующим образом:

    abababababababab

В качестве другого примера, если игрок 1 удерживает клавишу «а» и также нажимает клавишу «b», мне нужно обработать ввод следующим образом:

    aaaaaaabaaaaaaaa

Таким образом, одновременные нажатия клавиш не прерывают друг друга. Поэтому мне нужно опрашивать клавиши на клавиатуре с заданным интервалом и создавать собственную реализацию повторителя нажатия клавиш.

Есть ли способ в c (с или без ncurses) просто опрашивать клавиатуру на некотором интервале времени и читать все клавиши, которые в данный момент нажимаются? Оттуда я могу просто создать поток ввода с клавиатуры, чтобы управлять повторяющимися действиями вручную. По сути, что-то вроде kbhit, поэтому я могу проверить состояние данного ключа. Но это также позволит мне опрашивать клавиши со стрелками.

1 Ответ

1 голос
/ 04 апреля 2019

Это не работает таким образом:

В основном что-то вроде kbhit, поэтому яМожно проверить состояние данного ключа.Но это также позволит мне опрашивать клавиши со стрелками.

В любой системе, которая не разрешает прямой доступ к оборудованию (MS-DOS - единственный пример, с которым вы, вероятно, столкнулись, другиебудет включать в себя встроенные системы ), в терминальном приложении вы сможете прочитать только последовательность символов (не * ключей ).Приложения с графическим интерфейсом опираются на сервер, который напрямую обращается к некоторому оборудованию (более), но преобразует данные.

В терминале (например, используемом ncurses) вы можете только проверить, включают ли входящие символытот, который соответствует клавише клавиатуры, которая вас интересует. Клавиши со стрелками отправляют последовательность символов: с помощью ncurses вы можете либо прочитать отдельные символы в последовательности, либо использовать ncurses для сопоставления последовательности с известной клавишей вописание терминала.

Даже с учетом системных особенностей, таких как консоль Linux, вы не найдете особой поддержки для чтения клавиатуры в целом: только символьные события.Прочитайте kbd_mode и console_ioctl, чтобы увидеть, что доступно, с учетом этого древнего предостережения последнего:

Предупреждение. Не рассматривайте эту справочную страницу как документацию по консоли Linux ioctls.Это предусмотрено только для любопытных, как альтернатива чтению источника.Ioctl - это недокументированные внутренние компоненты Linux, которые могут быть изменены без предупреждения.(И действительно, эта страница более или менее описывает ситуацию с версией ядра 1.1.94 ; есть много незначительных и не столь незначительных различий с более ранними версиями.)

Предлагаемая ссылка Получение событий нажатия и отпускания клавиш в приложениях терминала Linux? дает некоторую полезную информацию.Но, как уже отмечалось, вопрос (помимо последнего упомянутого пункта) является дубликатом .

...