Нет, правда. Как правильно обрабатывать ввод с клавиатуры в игре с использованием какао?
Допустим, вы создаете игру для Mac OS X. Фактически, допустим, вы создаете Quake, только сейчас 2011 год, и вы бы предпочли использовать только современные, не устаревшие фреймворки.
Вы хотите, чтобы ваша игра была уведомлена, когда пользователь нажимает (или отпускает) клавишу, любую клавишу на клавиатуре. Это включает в себя модифицирующие клавиши, такие как Shift и Control. Отредактировано для добавления: Кроме того, вы хотите знать, была ли нажата левая или правая версия клавиши-модификатора.
Вы также хотите, чтобы в вашей игре был экран конфигурации, где пользователь может просматривать и изменять конфигурацию клавиатуры. Он должен содержать такие вещи, как:
- Двигаться вперед: W
- Прыжок: ПРОСТРАНСТВО
- Огонь: LCTRL
Чем ты занимаешься? Я пытался найти хороший ответ на этот вопрос в течение дня или около того, но не удалось.
Вот что я придумал:
- Подкласс NSResponder, реализуйте keyUp: и keyDown:, как в этом ответе. Проблема этого подхода заключается в том, что keyUp: и keyDown: не будут вызываться, когда пользователь нажимает только клавишу-модификатор. Чтобы обойти это, вы можете реализовать flagsChanged:, но это похоже на хак.
- Используйте Quartz Event Tap. Это работает только в том случае, если приложение работает от имени пользователя root или пользователь разрешил доступ для вспомогательных устройств. Кроме того, события клавиш-модификаторов все еще не считаются обычными событиями клавиш.
- Используйте HIToolbox. Практически ничего не упоминается в документах для разработчиков 10.6. Похоже, очень, очень устарела.
Итак, как правильно это сделать? Это действительно похоже на проблему, которая должна иметь хорошо известное, хорошо документированное решение. Не похоже, что игры невероятно нишевые.
2 ответа
Как уже говорили другие, нет ничего плохого в использовании -flagsChanged:
, Есть еще один вариант: использовать IOKit HID API. Вы должны использовать это в любом случае для ввода с помощью джойстика / геймпада и, возможно, с помощью мыши; это может или не может быть удобно для ввода с клавиатуры тоже, в зависимости от того, что вы делаете.
Это выглядит многообещающе:
+ [NSEvent addLocalMonitorForEventsMatchingMask: handler:]
Кажется, что вы новичок в 10.6 и звучит так же, как вы ищете. Больше здесь: