如何处理不同的键盘布局?


10

假设我有一个在QWERTY布局上使用WASD控件的游戏。例如,尝试在Dvorak布局上使用这些控件并不理想(等效<A:H于QWERTY)。显然,我想使用与QWERTY相同的物理键(,aoe在DVORAK上。

我提出了一些可能的解决方案:

  • 强制用户使用QWERTY
    • 显然不理想,特别是对于国际用户
  • 根据键盘布局更改快捷方式(WASD->,aoe)
    • 强迫我为每个受支持的布局制作布局图(可自动化)
    • 如果快捷方式不只是WASD,对于用户来说最容易
  • 强制用户自己定义快捷方式
    • 更灵活
    • 烦人的快捷键是否很多
    • 可与第二个选项结合使用
  • 使用硬件键码
    • 跨键盘一致吗?

通常如何处理这类事情?

Answers:


9

监听扫描代码。如何完成此操作取决于您的OS(未列出)。在Windows上,您可以使用MapVirtualKey从WM_KEYDOWN和朋友那里获取给定虚拟密钥代码的扫描代码。。扫描代码基于物理密钥,并且不受布局影响。

快速阅读http://www.altdevblogaday.com/2011/10/02/i-never-managed-to-go-left-on-first-try/

是的,正如Nicol Bolas所说,您可以并且应该让用户解决它。但是,只要开箱即用就可以了,您的用户将不胜感激。

请注意,您(可能)在错误地输入角色,就像绝大多数游戏开发人员一样。确保对于文本,您始终使用WM_CHAR(或其他操作系统上的等效字符),而不是使用WM_KEYDOWN进行文本输入。假定由于某些布局上使用了“死键”,因此假设按下“ a”键时您应该向文本输入控件输入“ a”是完全错误的。您还可以为东亚市场提供IME(或等效于OS)的支持,该市场的字符远远超出合理地可以容纳在键盘上的字符,并且需要特殊的UI进行键入。在游戏中处理IME是一件很痛苦的事情(完全是一件痛苦的事情),但我认为值得将您的产品吸引到更大得多的市场中。同样,WM_KEYDOWN永远不会用于文本。


好建议。我没有列出操作系统,因为我正在寻找一般准则/期望(我可以处理实施细节)。
Beatgammit 2013年

6

您应该始终让演奏者可以更改其键分配。这就是“通常处理”的方式:让玩家进行更改。一些玩家在玩游戏时会将键盘设置为QWERTY,因为这是大多数游戏所期望的。有些人会将其设置为当前的键盘,并依赖于更改键的功能。


1
更改语言时该怎么办?例如,即使游戏是法文版,如果他们希望保留其AZERTY布局,法国人是否希望更改WASD-> ZQSD?
Beatgammit

1
@tjameson:你读了我的答案吗?让他们重新定义其关键任务。这样就不会有问题了。
Nicol Bolas

1
是的,我确实阅读了您的答案,并且可能会接受您的建议。我只是想确保在运送给不同区域的用户时没有期望。
Beatgammit

3

如果您无法监听扫描代码(例如在开发Flash游戏时),则可以进行键绑定,该键绑定适用于尽可能多的布局。大多数键盘布局非常相似,只有少数例外。

遵循ISO 9995(最多)的键盘布局是这样排列的:

ISO之后的键盘布局

基本上,黑键是可以安全使用的。


有关键盘布局的详细信息,请参见QWERTYQWERTZAZERTYQZERTY
Chuck Walbourn 2015年

3

大多数大型预算游戏(那些具有国际分销商的游戏)都可以直接使用ZQSD而不是WASD进行广告素材布局。一款体面的游戏还将在第一级引入布局,其他游戏将让玩家通过自定义屏幕发现布局。可以通过要求OS切换布局来检测实现策略。游戏要么在内部使用扫描码(位置),然后在显示配置对话框和提示时将它们映射到键码(符号)。或者在内部使用键控代码,并在启动或首次启动时检测布局。

第一种策略(内部扫描代码)更健壮,但确实需要格外小心,以防止抽象泄漏出去。向用户展示密钥时,请记住将扫描代码重新映射为密钥代码(在教程,提示和自定义对话框中)。进行文本输入时,您仍然需要查看键码(例如,让播放器键入其名称)。如果您需要处理更多的文本,请考虑使用平台的文本输入支持,这超出了游戏引擎的权限(处理死键,大写锁定,复制粘贴,高级输入法...)。

移植从未使用过扫描码的游戏时(对于体面的引擎而言,情况并非如此,因为扫描码也更接近于硬件且速度更快),另一种策略可能更实用。您可以使用SDL2函数SDL_GetKeyFromScancodeSDL_GetScancodeFromKey或特定于平台的等效项将扫描码映射为键码。如果还使用SDL2事件循环,则这些功能将在布局切换之间保持准确。避免在Windows上使用GetKeyboardLayout()之类的函数;不能保证您可以在已知列表中找到布局。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.