Для игр необходим низкоуровневый доступ к клавиатурному входу. В Windows есть DirectInput. Но какую технологию используют разработчики игр Mac OS X?
Очевидно, что достаточно игр Mac, которые получают ввод с клавиатуры только вправо, без недостатков общеизвестных решений:
Решение # 1: Использовать события keyUp/keyDown
-(void)keyUp:(NSEvent*)event;
-(void)keyDown:(NSEvent*)event;
Недопустимый недостаток: события keyDown повторяются в соответствии с настройками системных настроек для "частоты повторения клавиш" и "задержки повторения клавиш". Это вызывает начальное событие keyDown, за которым следует пауза, прежде чем она начнет повторяться со скоростью, заданной параметром настройки системы. Это решение не может использоваться для непрерывных ключевых событий.
Интересно, можно ли отключить поведение повторения клавиш? Я полагаю, что вы могли бы прочитать первый ключ KeyDown, а затем запомните состояние "key with keyCode x is down" в своем классе до тех пор, пока не будет получено событие keyUp для этого ключа, тем самым минуя проблемы задержки повторения и повторения.
Решение # 2: Использовать кратки событий для проектов Quarts
См. Кварцевая служба служб событий. Это кажется достаточно низким уровнем.
Недопустимый недостаток: требуется, чтобы вспомогательные устройства включались в системные настройки в разделе Universal Access - Keyboard. Хотя это может быть включено по умолчанию, нет гарантии, что он может быть отключен в некоторых системах.
Я также читал, что для кратковременных событий Quartz приложение должно запускаться от имени root, но не найдено подтверждения для этого.
Решение # 3: Carbon Events/IOKit HID
Carbon Event Manager Reference отмечен как устаревший и не должен использоваться для новой разработки.
Недопустимый недостаток: никто не знает, как долго события Carbon будут поддерживаться в будущих версиях Mac OS.
Помимо того, что Carbon является устаревшей базой, это все же кажется лучшим решением. Но есть ли другие недостатки для использования Carbon Events?
Вопросы:
Какую технологию используют разработчики игр для Mac OS X для приема событий ввода с низким уровнем клавиатуры? Если они используют одну из вышеперечисленных технологий, как они справляются с недостатками, о которых я упоминал?
UPDATE:
В конце концов я перешел на использование регулярных сообщений NSEvent и завернул их в опрятный API для опроса состояний клавиатуры.