
前書き
キーボードで入力するには、座ったり、じっと立ったりします。対照的に、ゲームパッドはポータブルでコンパクトです。それらを制御することにより、部屋の中を歩き回ったり、ソファに横になったりすることができます。
ゲームパッドのボタンの数が少ないため、プログラミングなどで大量のテキストを入力する手段とは誰も考えていませんでした。
ただし、アナログスティック(およびほとんどのゲームパッドには2つあります)には、無限の入力オプションを提供する可能性があります。問題は、親指の効率を最大にし、緊張を最小にするための適切なジェスチャーを選択することです。
ゲームパッドのテキストを入力する方法はたくさんあります。コンソールゲームをプレイしたことがある場合は、そのうちの1つを使用したことがある可能性があります。

Legend
ofZeldaの画面上のテキスト入力Legendof Zeldaでは、プレーヤーは矢印の付いたDパッドを使用して順番に文字を選択し、確認ボタンを押すたびにテキスト入力フィールドに文字を追加する必要があります。
それ以来、より効率的な入力方法が開発されてきました。興味のある方は、Gamasutraの記事を読んでください。
残念ながら、私が見つけたすべての入力方法には、深刻な作業に適さない2つの大きな欠陥があります。
- 彼らは十分に速くありません
- 視覚的なフィードバックが必要です
スピードの必要性は明らかです。視覚的なフィードバックは、貴重な画面スペースを占有し、ユーザーの注意をそらし、流れを妨げて速度を低下させる可能性があるため、受け入れられません。
ただし、フィードバックがない場合は、十分な精度で入力できるようになるまで、すべてのジェスチャーを記憶して練習する必要があります。ビデオゲームでは、ユーザーがテキストの入力方法を学ぶのに数週間かかることはほとんどありませんが、どのプログラムでも使用できるテキストを入力する方法については、価格は許容範囲内であり、トレーニング自体はタッチ入力をマスターするようなものです。
この投稿では、ボリュームキーボード入力の代わりとして適したゲームパッド用のテキスト入力システムの作成に関連する手順を簡単に説明します。
ジェスチャーを決める
まず
pygame、Python言語に基づいてアナログゲームパッドスティックの動きを視覚化するためのツールを作成しました。わかりやすくするために、スティックの現在の位置だけでなく、スティックが移動するパスを確認できるように、以前の位置を徐々に明るくするグレーの色合いも表示するようにツールを補足しました。
下の図は、両方のアナログスティックが同時に内側、上向き、外向き、下向き、再び内向きに移動し、中央に戻る様子を示しています。

アナログスティック
の動きのパターンを視覚化する最初に気付いたのは、コントローラーのニュートラル状態はスティックを中央に見つけることであるため、すべての入力オプションはこのニュートラル状態から到達可能であり、スティックを中央に戻すことですべて完了する必要があるということです。
これらの制限を念頭に置いて、可能な限り最も簡単な入力は、スティックの1つを任意の方向に動かして中央に戻すことであると考えました。

左スティックが上下して中央に戻りました。
盲目的に正確に選択できる方向と方向はいくつですか。次の例を考えてみましょう。

左スティックが上下、中央、左右に移動し、右スティックが斜めに移動しまし
た数分間の実験で、軸に沿った方向を正確に選択でき、他の方向への入力ははるかに精度が低いことがわかりました(前の画像を参照)。
次に見つかった最も単純な入力方法は、1段階および2段階の円運動でした。

左スティックが上、左、中央に戻る

左スティックは上下左右に移動し、中央に戻りました。
これまでに考案されたすべてのジェスチャーを考慮に入れると、各スティックに4 + 8 + 8 = 20の入力オプションがあります。
もちろん、両方のスティックを同時に移動して、組み合わせた入力ジェスチャを作成することもできます。

両方のスティックが同時に上下に移動し、中央に戻ります。
ジェスチャーを組み合わせると、合計20 * 20 + 20 + 20 = 440の入力オプションが得られます。これは、私の意見では十分すぎるほどです。
エンコーディングジェスチャー
各スティックの入力スペースを4つのセクターに分割し、各セクターに番号を割り当てました。

セクターに分割された入力スペース次に
、スティックがニュートラル位置にあるのか、セクターの1つにあるのかを判断するために、中心の周りにしきい値領域を設定します。

中央の円形の敷居
ご覧のとおり、敷居の半径はかなり大きくなっています。実験を通じて、これが最小のエラーを提供する最良の半径であると判断しました。
スティックのいずれかが中心から外れ、しきい値領域を超えると、入力シーケンスが開始されます。両方のスティックがしきい値領域内の中央に戻ると、シーケンスは完了したと見なされ、スティックの動きを表す1対のタプルに変換されます。

入力用のスティックを移動します((0、)、(2、3))
ジェスチャーをアクションにリンクする
この場合、アクションは単なるキーボードキーです。ゲームパッドのトリガーボタンは、Shift、Ctrl、Alt、およびSuperキーにバインドできます。これは、これらのキーを組み合わせて使用するため(たとえば、Ctrl-C)便利です。
入力したジェスチャーとキーの最適なバインドを決定するために、キーロガーを使用してすべてのキーストロークを記録し、各キーの頻度を数週間分析しました。
最も頻繁に押されるキーは、最も単純な(したがって最も速い)ジェスチャにバインドする必要があります。各スティックの入力の長さを追加することにより、ジェスチャーの複雑さを推定しました。たとえば、上記の入力((0、)、(2、3))の複雑さは1 + 2 = 3です。
この場合、1つのスティックから入力する場合、2つのスティックを交互に使用すると、同じスティックからの複数の入力よりも高速になるため、入力するキーを別のスティックにバインドする方がよい場合がよくあります。
このロジックに従って、最初に1つのスティックからすべての可能な入力オプションを生成し、難易度別にグループ化しました。各難易度グループの入力数を数え、最も頻度の高いキーのソートされたリストからキーの数を取得しました。
私の目標は、これらのキーを2つのグループに分割することでした。1つは左スティック入力用、もう1つは右スティック用です。理想的なグループを見つけるために、ノードがキーであり、重み付きエッジがキーの組み合わせの頻度であるグラフを作成しました。
グラフが2分割になるまで、重みの最も低いエッジを周期的に削除しました。グラフが切断された場合は、接続されたコンポーネントにパーティショニングアルゴリズムを再帰的に適用し、最終的にグループを独立したセットに結合しました。
次の例を考えてみましょう。複雑さの最初のグループは、複雑度が1のすべての入力で構成され
((0,), ()), ((1,), ()), ((2,), ()), ((3,), ()), ((), (0,)), ((), (1,)), ((), (2,)), ((), (3,))ます。
このグループには8つの入力があるため、ソートされたリストから最も頻度の高い8つのキーを取得します。これは
'e', 'o', 't', 'a', 'i', 's', 'j', 'r'です。これらのキーをノードとしてグラフを作成し、各キーの組み合わせの頻度に応じて、これらのノード間のエッジに重みを割り当てます。

eキーとrキーはほとんどの場合組み合わされるため、別のスティックに取り付ける必要があります。
グラフから弱いエッジを削除すると、遅かれ早かれリンクが解除されます。

jキーは一般的ですが、分離されています。
キー
jが8つの最も頻繁なキーの1つであるのに、残りの頻繁なキーへのリンクが非常に弱いのはなぜか疑問に思われるかもしれません。その理由は、jVIM plusを使用するときに積極的に使用されるためです。私のシステムでは、ウィンドウを切り替えるためのホットキーの組み合わせの一部です。したがって、テキストよりも単独で使用されることがよくあります。
グラフが切断されているので、接続されているコンポーネントにアルゴリズムを適用し続けます。ノードのみで構成されるサブグラフ
jは、すでに2つの部分に分かれています(j+空のセット)。アルゴリズムを別のコンポーネントに再帰的に適用しています。

最も弱いエッジを削除すると、コンポーネントは2つの部分になり
、グループ内のノード間にエッジがなくても、コンポーネントを2つのグループに簡単に分割できます。

二者構成要素スキーム
最後に、二者セットを組み合わせます。

最初の8つのキーに対して取得されたグループ化
ご覧のとおり、最も強力なリンク(最も頻繁なキーボードショートカット)は、異なる側のノード間にあります。これはまさに私が望んでいたことです。
他の難易度グループ(シングルスティック入力のみ)に対してこのプロセスを繰り返しました。次に、考えられるすべての組み合わせ入力を生成し、難易度ごとにグループ化し、残りのキーをそれらの入力オプションに割り当てました。入力を組み合わせるには両方のスティックを使用する必要があるため、ここではキーを2つのグループに分割する問題は発生しません。Python
パッケージを使用して、
pyautoguiアクションがトリガーされたときにキーボードイベントを生成しました。
練習
私は、
ktouchほぼ20年前にタイピングを教えていたのと同じタッチトレーナーを使用しました。この目的のために、私は専門的なレッスンを作成しました。

ktouchのゲームパッドでアナログ入力を練習する
観察
- この入力システムを実行するPythonプロセスは通常CPUリソースの10%しか消費しませんが、バックグラウンドで常に実行する必要がある場合は、プロセッサがより多くのことを実行できるように、それを再実装して低レベルの言語で最適化します。コストのかかるタスク。
- DualShock4ゲームパッドを購入した後、斜め入力が非常に正確にできることに気付きました。対角入力を統合すると、より複雑な入力オプションの数が減り、速度が向上します。
- , . , . , , , .
- , . , , .
- . .
ほんの数日で、ゲームパッド用の効率的な入力システムを作成しました。行うことができる多くの改善がありますが、この概念のチェックは、ゲームパッドでの効率的なテキスト入力が可能であることを示しています。プロジェクトコードはgithubに掲載されています。