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

时间:2011-04-30 22:01:27

标签: cocoa macos

假设您正在为Mac OS X创建游戏。事实上,假设您正在创建Quake,只有2011年,您更愿意只使用现代的,不推荐使用的框架。

当用户在键盘上按下(或释放)键任意键时,您希望通知您的游戏。这包括修改键,如移位和控制。 已编辑添加:此外,您还想知道是否按下了修改键的左侧或右侧版本。

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

  • 前进:W
  • 跳跃:空间
  • 火:LCTRL

你做什么的?我一直试图找到一个的答案,但现在还没有成功。

这就是我想出来的:

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

那么,这样做的正确方法是什么?这真的感觉就像一个应该有一个众所周知的,记录良好的解决方案的问题。这并不像游戏是非常小众的。

2 个答案:

答案 0 :(得分:7)

正如其他人所说,使用-flagsChanged:并没有错。还有另一种选择:使用IOKit HID API。无论如何你应该使用它来进行操纵杆/游戏手柄输入,可以说是鼠标输入;键盘输入可能也可能不方便,取决于你正在做什么。

答案 1 :(得分:1)

这看起来很有希望:

+ [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