我有一个名为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
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] 删除。
我来说两句