見出し画像

ゲーム入力の状態を共通化する

ゲームを作成していると、複数のデバイスからの入力に対応させたくなる場合もあると思います。よくあるパターンがキーボード入力とデジタルジョイスティック入力の併用です。

複数の入力を併用できるようにするためには、ちょっとした工夫が必要となります。その方法はとても単純です。各入力情報をひとつのフォーマットに統一すればよいのです。

入力情報をひとつのフォーマット統一すると、プログラム上では同じように扱うことができます。論理和演算により、キードードとデジタルジョイスティックの両方からの入力を同時に扱うこともできるようになります。

キーボード入力

キーボードの入力は、アーキテクチャにもより異なりますが、大方はキーコードによる入力と、キーにマッピングされたステータスを参照する入力の2種類が用意されています。

キーコードによる入力では、たとえばaキーを押せば’a’(0x61)という値が返り、bキーを押せば’b’(0x62)という値が返ってきます。

キーにマッピングされたステータスを参照する入力では、すべてのキーの状態をフラグとして返します。おされていなければ0、押されていれば0以外の値となります。

フラグがキーコードにマッピングされている場合は参照が楽です。たとえば、aキーのステータスを参照したい際にはstate['a']と書くことができます。

Windows APIでは、前者はGetKeyStateとGetAsuncKeyState、後者はGetKeyboardStateというインターフェースが用意されています。

ジョイスティック入力

ジョイスティックの入力は、多くのアーキテクチャではビットマップで扱っています。どのようなビットへマッピングされるかはアーキテクチャに依存しています。

例として上下左右の4方向、それからABCDの4つのボタンの計8つの入力しかないデバイスのことを考えてみましょう。8つのビットへマッピングされるので、扱うデータは1オクテットになります。

上位ビットから上下左右ABCDと割り当てられているので、ジョイスティックのレバーが上へ倒されていたら第7ビットがONになります。

0b1000_0000

ABボタンを同時押しした場合は次のようになります。

0b0000_1100

入力状態を共通化する

今回はこのキーボードとデジタルジョイスティックという2つの入力値を共通化してみます。

一番楽な実装はキーボードの入力値をデジタルジョイスティックの入力値にマッピングする方法です。

今回はカーソルキーを上下左右に、ZXCVキーをABCDキーへマッピングさせることを考えます。

たとえばカーソルキーの上が押されていたら第7ビットをONにするというわけです。

このようにしておけば、キーボードとデジタルジョイスティック2つの入力状態をマージすることができます。

入力状態をマージする

キーボードとデジタルジョイスティックの入力状態をマージするのは簡単です。

両方のデバイスをセンシングし、得られた値を論理和演算するだけです。

もし片方のデバイスのみ入力を受けつけるようにしたい場合はどうすればよいでしょうか?

たとえばキーボードもデジタルジョイスティックも入力されているがデジタルジョイスティックの入力のみを受けつけたいという場合です。

この場合はデジタルジョイスティックから得られた値が0以外となっていれば、デジタルジョイスティックからの入力値を生かし、0ならキーボードから得られた入力値を生かすようにします。

この記事が気に入ったらサポートをしてみませんか?