Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不,真的。在使用Cocoa的游戏中,处理键盘输入的正确方法是什么?_Cocoa_Macos - Fatal编程技术网

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

不,真的。在使用Cocoa的游戏中,处理键盘输入的正确方法是什么?,cocoa,macos,Cocoa,Macos,假设您正在为MacOSX创建一个游戏。事实上,假设您正在创建Quake,但现在是2011年,您更喜欢只使用现代的、不受欢迎的框架 您希望在用户按下(或释放)键盘上的某个键或任意键时通知您的游戏。这包括修改键,如shift和control编辑以添加:此外,您还想知道是否按下了修改键的左版本或右版本 您还希望您的游戏有一个配置屏幕,用户可以在其中检查和修改键盘配置。它应该包含以下内容: 前进:W 跳跃:空间 火警:LCTRL 你是做什么的?大约一天来,我一直试图找到一个很好的答案,但没有成功 这

假设您正在为MacOSX创建一个游戏。事实上,假设您正在创建Quake,但现在是2011年,您更喜欢只使用现代的、不受欢迎的框架

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

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

  • 前进:W
  • 跳跃:空间
  • 火警:LCTRL
你是做什么的?大约一天来,我一直试图找到一个很好的答案,但没有成功

这就是我想到的:

  • 子类NSResponder,实现keyUp:和keyDown:,如中所示。这种方法的一个问题是,当用户只按修改键时,不会调用keyUp:和keyDown:。为了解决这个问题,您可以实现flagsChanged:,但这感觉像是一个黑客
  • 使用一个。仅当应用程序以root用户身份运行,或者用户已启用辅助设备访问时,此选项才有效。此外,修改器关键点事件仍不算作常规关键点事件
  • 使用HIToolbox。在10.6开发者文档中几乎没有提到这一点。它似乎非常非常不受欢迎
那么,正确的方法是什么呢?这真的感觉像一个问题,应该有一个众所周知的、有据可查的解决方案。这并不是说游戏是令人难以置信的利基游戏。

这看起来很有希望:

+[NSEvent addLocalMonitorForEventsMatchingMask:处理程序:]

在10.6中似乎是新的,听起来就像你正在寻找的一样。详情如下:


正如其他人所说,使用
-flagshanged:
没有什么错。还有另一种选择:使用IOKit HID API。不管怎样,你都应该使用它来进行游戏杆/游戏板输入,也可以说是鼠标输入;键盘输入也可能很方便,也可能不方便,这取决于您的操作。

否,这仍然不会将修改器键事件视为常规键事件(请注意NSKeyDownMask和NSFlagsChangedMask)。这似乎只是像NSResponder那样获得事件通知的一种方式,而无需创建实例。这基本上是问题中提到的Quartz event taps的Cocoa版本。FWIW,我不认为
-flagshanged:
nsflagshangedmask
是一种黑客行为。这是一种记录在案的收到修改键(如控件)更改通知的方式。我并不是说flagsChanged:是一种黑客行为,而是说将其用于此目的感觉像是一种黑客行为。如果您正在编写文本编辑器,那么以不同的方式处理修改器键事件是一个好主意!然而,如果你想知道刚才按的是哪一个键,不管是哪一种键,flagsChanged:对我来说似乎不太合适。当然,您可以存储[event modifierFlags]的值和与之相对应的diff——这是可以做到的——但这已经足够麻烦了,我觉得应该有一种更好、更直接的方法。有吗?我想没有别的办法了。据我所知,Cocoa遵循您描述的推理:在大多数情况下,修改键本身并不相关。这就是说,您可以将
-keyDown:
-keydup:
-flagshanged:
抽象为一个或两个方法,有效地执行应用程序中的操作-这三个方法只需过滤事件并调用自定义方法。哇,奇怪的行为。我已经通过一个静态计数器来解决它:在你的代码>如果部分,我增加计数器,如果计数器小于2,就把它看作是一个键;否则,我递减计数器并认为它是一个密钥。在<代码>其他<代码>部分中,我递减计数器并将其视为一个键。我只为一把钥匙做了这件事;每个修改键都必须有一个计数器。我不确定这是一个好的解决方案,因为2是常数,我猜理论上用户有多个键盘,2应该是4。不过,我不能测试这个。好吧,就像我在对我的问题的评论中提到的,使用flagsChanged有一些问题:对于这一点,即它似乎没有区分左右修饰符键。(不过,这个要求不在我最初的问题中。我的错。)IOKit HID API看起来很有希望。我会调查的!是的,这是一个赢家。我对API的理解有点困难,但根据我到目前为止所能理解的,这提供了我所需要的。干杯对键事件使用HID的一个复杂问题是将键映射到配置接口的字符和符号。很方便,我已经为此编写了一个库。我已经好几年没试过了,但我最后听说它有效。