Нет, правда. Как правильно обрабатывать ввод с клавиатуры в игре с использованием какао? - PullRequest
16 голосов
/ 01 мая 2011

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

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

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

  • Движение вперед: W
  • Прыжок: ПРОБЕЛ
  • Огонь: LCTRL

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 01 мая 2011

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

1 голос
/ 01 мая 2011

Это выглядит многообещающе:

+ [NSEvent addLocalMonitorForEventsMatchingMask: handler:]

Кажется новым в 10.6 и звучит так же, как вы ищете.Больше здесь:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html%23//apple_ref/occ/clm/NSEvent/addLocalMonitorForEventsMatchingMask:handler:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...