cocoa - 不完全是。使用 Cocoa 处理游戏中键盘输入的正确方法是什么?

标签 cocoa macos

假设您正在为 Mac OS X 创建一款游戏。事实上,假设您正在创建 Quake,只不过现在是 2011 年,您更愿意只使用现代的、未弃用的框架。

您希望当用户按下(或释放)键盘上的某个键(任意键)时,您的游戏收到通知。这包括修饰键,例如 Shift 和 Control。 编辑添加:此外,您想知道是否按下了修改键的左侧或右侧版本。

您还希望您的游戏有一个配置屏幕,用户可以在其中检查和修改键盘配置。它应该包含以下内容:

  • 向前移动:W
  • 跳跃:空格
  • 开火:LCTRL

你是做什么的?我已经花了一天左右的时间试图找到一个好的答案,但还没有成功。

这是我想出的:

  • 子类 NSResponder,实现 keyUp: 和 keyDown:,如this answer 。这种方法的一个问题是,当用户仅按下修饰键时, keyUp: 和 keyDown: 将不会被调用。要解决这个问题,您可以实现 flagsChanged:,但这感觉就像是黑客攻击。
  • 使用 Quartz Event Tap 。仅当应用程序以 root 身份运行或用户启用了辅助设备的访问权限时,此功能才有效。此外,修饰键事件仍然不算作常规键事件。
  • 使用 HIToolbox。 10.6 开发人员文档中几乎没有提及它。它似乎已经被非常非常不赞成了。

那么,正确的方法是什么?这确实感觉像是一个应该有一个众所周知的、有详细记录的解决方案的问题。这并不是说游戏是非常小众的。

最佳答案

正如其他人所说,使用 -flagsChanged: 没有任何问题。还有另一种选择:使用 IOKit HID API。无论如何,您应该将其用于操纵杆/游戏 handle 输入,甚至鼠标输入;键盘输入可能方便也可能不方便,具体取决于您在做什么。

关于cocoa - 不完全是。使用 Cocoa 处理游戏中键盘输入的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5844892/

相关文章:

objective-c - 如何检查 NSData 是否有多媒体内容?

cocoa - 正在搜索 Mac OSX 系统词典?

macos - 用于外部接口(interface)的 Pyaudio (Mac OSX)

macos - Apple 语音问题的可访问性与字段集图例

python - CMake 中的错误 Python 2 库

c - 编写伪装为TTY的程序

Cocoa - 防止窗口重叠

objective-c - 无法从 -mouseDown :event 获取有用的位置

objective-c - EXC_BAD_ACCESS 奇怪的十六进制到字符串的转换

objective-c - 我该如何修改以及修改什么类/文件才能以编程方式插入 Cocoa NSButton?