さまざまなキーボードレイアウトをどのように処理できますか?


10

QWERTYレイアウトでWASDコントロールを使用するゲームがあるとします。たとえば、これらのコントロールをDvorakレイアウトで使用しようとするのは理想的ではありません(<A:HQWERTY と同等)。明らかに、QWERTYが使用するのと同じ物理キーを使用したいと思います(,aoeDVORAKで)。

私はいくつかの可能な解決策を考え出しました:

  • ユーザーにQWERTYの使用を強制する
    • 特に国際的なユーザーにとっては明らかに理想的ではありません
  • キーボードレイアウトに基づいてショートカットを変更する(WASD->、aoe)
    • サポートされているレイアウトごとにレイアウトマップを作成するように強制します(自動化可能)
    • WASD以外のショートカットがある場合、ユーザーにとって最も簡単です
  • ユーザーに自分でショートカットを定義させる
    • より柔軟
    • ショートカットがたくさんあると困る
    • 2番目のオプションと組み合わせて使用​​できます
  • ハードウェアキーコードを使用する
    • キーボード間で一貫していますか?

このタイプのものは通常どのように扱われますか?

回答:


9

スキャンコードを聞きます。これがどのように行われるかは、リストしていないOSによって異なります。Windowsでは、使用してWM_KEYDOWNや友人から与えられた仮想キーコードのスキャンコードを取得することができMapVirtualKeyを。スキャンコードは物理キーに基づいており、レイアウトの影響を受けません。

http://www.altdevblogaday.com/2011/10/02/i-never-managed-to-go-left-on-first-try/をざっと読んでください

だから、はい、ニコルボーラスが言ったように、ユーザーにそれを回避させることができますし、そうすべきです。しかし、箱から出してすぐに機能させることは難しくなく、ユーザーはそれを高く評価します。

ゲーム開発者の大半と同様に、(おそらく)文字入力を誤って処理していることに注意してください。テキストの場合、テキスト入力にWM_KEYDOWNを使用するのではなく、常にWM_CHAR(または他のOSでは同等のもの)を使用するようにしてください。一部のレイアウトではデッドキーを使用しているため、「a」キーが押されたときにテキスト入力コントロールに「a」を入力する必要があると想定することは完全に間違っています。また、キーボードに適度に収まりきらない文字があり、入力するための特別なUIが必要な東アジア市場では、IME(またはOSで同等のもの)をサポートできます。ゲームでIMEを処理するのは面倒です(それを処理するのは面倒です)が、はるかに大きな市場のセットに対する製品の魅力を高めるには、私にとってそれだけの価値があります。この場合も、WM_KEYDOWNがテキストに使用されることは決してありません。


いいアドバイス。一般的なガイドライン/期待事項(実装の詳細を処理できる)を探していたため、OSを記載しませんでした。
beatgammit 2013年

6

常にプレーヤーにキー割り当てを変更する機能を与える必要があります。それが「通常処理される」方法です。プレーヤーに変更させてください。一部のプレーヤーは、ゲームをプレイするときにキーボードをQWERTYに設定します。これは、ほとんどのゲームで期待されていることだからです。現在のキーボードに設定したままにして、キーを変更する機能に依存する人もいます。


1
言語が変更されたときはどうですか?たとえば、ゲームがフランス語であっても、AZERTYレイアウトを維持したい場合、フランス語はWASD-> ZQSDを変更することを期待していますか?
beatgammit 2013年

1
@tjameson:私の答えを読みましたか?キー割り当てを再定義させます。その後、問題はありません。
Nicol Bolas 2013年

1
はい、私あなたの答えを読みました、そして私はおそらくあなたの助言に行くでしょう。異なるロケールのユーザーに出荷するときに期待がなかったことを確認したかっただけです。
beatgammit 2013年

3

スキャンコードをリッスンできない場合(フラッシュゲームの開発時など)は、できるだけ多くのレイアウトで機能するキーバインディングを作成できます。ほとんどのキーボードレイアウトは非常によく似ていますが、いくつかの例外があります。

ISO 9995(ほとんど)に準拠したキーボードレイアウトは、次のように配置されています。

ISO後のキーボードレイアウト

基本的に、黒いキーは安全に使用できます。


キー配列の詳細については、QWERTYQWERTZAZERTYQZERTYを
Chuck

3

ほとんどの大規模な予算のゲーム(国際ディストリビューターのゲーム)はそのままで問題なく動作し、azertyレイアウトにWASDではなくZQSDを使用します。まともなゲームはまた、最初のレベルのレイアウトを紹介します、他のものはプレイヤーがカスタマイズ画面を通してそれを発見できるようにします。OSにレイアウトの切り替えを要求することで、実装戦略を検出できます。ゲームは内部的にスキャンコード(位置)を使用し、構成ダイアログとプロンプトを表示するときにそれらをキーコード(シンボル)にマップします。または、内部でキーコードを使用し、起動時または最初の起動時にレイアウトを検出します。

最初の戦略(内部的にスキャンコード)はより堅牢ですが、抽象化の漏れを防ぐために少し注意が必要です。チュートリアル、プロンプト、およびカスタマイズダイアログでユーザーにキーを提示するときは、スキャンコードをキーコードに再マッピングすることを忘れないでください。テキスト入力を行う場合(たとえば、プレーヤーに名前を入力させる場合)、キーコードを確認する必要があります。それ以上のテキストを処理する必要がある場合は、プラットフォームのテキスト入力サポートの使用を検討してください。これは、ゲームエンジンの範囲外です(デッドキー、capslock、コピー貼り付け、高度な入力メソッドなどを処理します)。

スキャンコードを使用したことがないゲームを移植する場合(適切なエンジンの場合はそうではありません。スキャンコードもハードウェアに近く、高速であるため)、他の戦略の方が実用的かもしれません。SDL2関数SDL_GetKeyFromScancodeおよびSDL_GetScancodeFromKey、またはプラットフォーム固有の同等の機能を使用して、スキャンコードをキーコードにマッピングできます。SDL2イベントループも使用する場合、これらの関数はレイアウトスイッチ全体で正確なままです。WindowsではGetKeyboardLayout()のような関数を避けてください。既知のリストでレイアウトを見つけることができるという保証はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.