为什么pygame的键码是特定于OS的?

埃里森·威廉斯(Ericson Willians)

我有一个名为Ergame的引擎,其中有一个名为erfunc的模块我在NT / Windows平台上编写它,现在在POSIX / Linux上编写。由于我发现pygame上的输入很多次都难以理解,并且想在IBM-STANDARD-US-PC和ABNT2键盘布局之间建立明显的区别,因此,我创建了几个常量,其值是pygame-keycodes我有问题。

例如,美国标准版式上“ ACUTE / TILDE”的键码是96。我已经检查了很多次。现在,在POSIX上,当我检查时,我得到39(并且对其他所有对象也是如此)。这基本上意味着:如果我引用pygame-name,例如pygame.K_UP,无论如何。但是,如果我直接引用键代码,它们会根据操作系统而有所不同(这基本上意味着我必须检测引擎上的操作系统并相应地定义常量。这很无聊。)

无论如何,我很好奇。为什么?

卡拉哈特

首先,我没有在Windows或Mac系统上进行输入的经验,但这是Linux方面正在发生的事情。

关键事件通常在进入程序之前要经过三个阶段的处理。键盘会生成一个扫描代码。操作系统将扫描码转换为键码。键盘映射将键控代码转换为符号。

  • 扫描码是特定于硬件的,代表键盘上的位置
  • 键码是操作系统映射到扫描码的值,通常在 /usr/include/linux/input.h
  • Keysyms是映射到键码的符号,由键映射定义。你可以用xmodmap -pke

对于SDL(PyGame充当包装器),scancode / keycode的区别有点模糊,并不重要。它报告为“ scancode”实际上是键码,您会注意到pygame的event.scancode将与xev中打印的“ keycode”值匹配。SDL称为“ sym”,pygame称为“ key”,实际上是SDL特定的密钥代码。按键符号由事件的“ unicode”值表示。

重要的部分是您实际上并没有获取原始扫描代码,因此可以预期它取决于操作系统而不是键盘。另外,如果获取原始扫描代码,则期望扫描代码在位置上等效,而不是字符上。因此,所有第1行col-1键都产生相同的扫描码,而与键盘布局无关。

尽管进行OS检查并拥有庞大的常量表可能很无聊,但这通常是完成的方式。好消息是SDL为您完成了此操作,因此您确实应该使用pygame.K_ *名称。如果支持多个键盘布局是一个问题,请考虑为每个布局添加一个输入配置菜单,而不是硬编码表。

我想留下一些链接以供进一步阅读,但我不确定该链接到什么。我现在将在此处离开《SDL输入指南》

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么要有特定于项目的RuntimeException?

为什么var目录不是特定于用户的?

为什么MonadIO特定于IO,而不是更通用的MonadTrans?

Ruby特定于OS的测试

什么不是特定于外壳的?

什么是特定于实例的错误

什么是特定于 libtool 的架构?

会话特定于什么?为什么不将IP和域名会话视为相同?

为什么第二次按时返回键码而不是键码的假值?

与xev相比,为什么showkey显示的键码不同?

为什么没有特定于调用 GCP 函数的 IAM 角色?

为什么我会得到std :: exp特定于平台的结果?

为什么我不能访问特定于我的孩子班级的方法?

为什么这个特定于类的 css 完全影响其他类?

为什么在JSF中使用h:dataTable显示动态数据时,特定于边框的属性似乎对行不起作用?

如果具有特定于常量的方法,为什么要为每种枚举类型创建不同的类文件?

为什么“特定于连接的DNS后缀”仅(默认)可用于有线连接,而不能用于无线

为什么不能将特定于供应商的伪元素/类组合到一个规则集中?

如何完全删除QLayout的边距(特定于Mac OS)

为什么不能将键码值记录到控制台窗口?

pygame为什么对我冻结?

为什么PyGame动画闪烁

sbt中特定于Scala版本的源目录是什么?

URI中特定于方案的部分是什么?

为什么当我在 pygame 中按下特定键时我的精灵不移动

为什么同时覆盖全局new运算符和特定于类的运算符不是模棱两可的行为?

为什么多字节字符到char32_t的转换使用UTF-8作为多字节编码而不是特定于语言环境的编码?

为什么在PyGame中什么也没画?

特定于案例的混合?