Нет, действительно. Каков правильный способ обработки ввода с клавиатуры в игре с помощью Cocoa?

Скажем, вы создаете игру для Mac OS X. На самом деле, предположим, вы создаете Quake, только в 2011 году, и вы предпочтете использовать только современные, не устаревшие фреймворки.

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

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

  • Перемещение вперед: W
  • Перейти: ПРОСТРАНСТВО
  • Пожар: LCTRL

Чем вы занимаетесь? Я пытался найти хороший ответ на этот день или около того сейчас, но не удалось.

Вот что я придумал:

  • Подкласс NSResponder, реализуйте keyUp: и keyDown:, как в этот ответ. Проблема с этим подходом заключается в том, что keyUp: и keyDown: не будет вызываться, когда пользователь нажимает только ключ-модификатор. Чтобы обойти это, вы можете реализовать flagsChanged:, но это похоже на взлом.
  • Используйте Quartz Event Tap. Это работает только в том случае, если приложение работает от имени пользователя root или пользователь имеет доступ к вспомогательным устройствам. Кроме того, события ключа-модификатора по-прежнему не учитываются как обычные события ключа.
  • Используйте HIToolbox. В документах разработчика 10.6 практически не упоминается. Это, кажется, очень, очень устарело.

Итак, каков правильный способ сделать это? Это действительно похоже на проблему, которая должна иметь хорошо известное, хорошо документированное решение. Это не похоже на игры невероятной ниши.

Ответ 1

Как говорили другие, нет ничего плохого в использовании -flagsChanged:. Существует еще один вариант: использовать API-интерфейс IOKit HID. Вы должны использовать это в любом случае для ввода джойстика/геймпада и, возможно, для ввода мыши; это может быть или не быть удобным для ввода клавиатуры, в зависимости от того, что вы делаете.