入力の利便性は、ゲームの命である。
いかに面白いゲームでも、キーコンフィグが固定されていたり、PADが使えなかったりすれば、時にプレイヤーは遊びそのものを諦めてしまう。特にアクションゲームや格闘ゲームなど、緻密な操作がゲームそのものに大きな影響を及ぼすものは、入力周りが少しでも甘いととても不便を強いられることになる。
前提
前提として、マウス・パッド・キーボードの状態は全て取れるようにしておく。ググれば載っているし、面倒ならDXライブラリに任せても良い。
本記事ではDXライブラリサンプルより、char Key[256]にキーボードの状態が入っていることとする。
キーコンフィグ
キーコンフィグの実装は簡単である。ただし、ゲームを開発する最初の段階で設計しておく必要がある。とはいえ一手間入れるだけでその利便性は格段に向上するため、是非実装したい。
まず、ゲームにおいて使うキーを決める。ジャンルにも因るが、Nintendo DSを基準に十字キー+四ボタン+LR+スタートセレクトの十二ボタンということにする。決めたら、int型の配列とenumでボタンを定義する。
const int INPUTKEY_MAX = 12; int MyKey[INPUTKEY_MAX]; enum { KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_A, KEY_B, KEY_C, KEY_D, KEY_L, KEY_R, KEY_START, KEY_SELECT };
続いてキーコンフィグデータを入れる配列の入った構造体を作る。構造体にする理由は扱いが便利だからだ。
typedef struct keyconfig_t { int k[INPUTKEY_MAX]; } keyconfig_t; keyconfig_t KeyConfig;
KeyConfigの中には、enumで定義したボタンにそれぞれ対応するキーの番号を入れておく。あとは毎フレーム取得されるキーボードの状態のうち、KeyConfigで設定されたキーが押されていればMyKeyの値を増やす。
for (int i=0;i<INPUTKEY_MAX;i++) { ( Key[KeyConfig.k[i]] ? MyKey[i]++ : MyKey[i]=0); }
これだけである。パッドの状態も同様に調べてあげればパッドとキーどちらを押してもMyKeyの値が変化するため、あとはキャラクターの移動にMyKeyを使って行えばよい。
if (MyKey[KEY_LEFT]==1) Character_x -= 10; if (MyKey[KEY_RIGHT]==1) Character_x += 10; // 条件を==1にすると、押した直後しか反応しない
決定キー・キャンセルキー
決定キーとキャンセルキーは、幅が広い方が良い。例えば、決定にはスペースでもENTERでもZでも使えたりすると便利である。また、どのようなキーコンフィグをしても決定ボタンとキャンセルボタンが一定であるとプレイヤーが混乱しなくて済む。特にパッドの場合は決定ボタンを誤って消してしまいキーコンフィグから抜けられない、という状況にならないようにしなければならない。
/* 決定キーが押されてるかどうか */ bool DecideKey() { return (Key[KeyConfig.k[4]]==1||Pad.key[4]==1||Key[KEY_INPUT_Z]==1|| Key[KEY_INPUT_SPACE]==1||Key[KEY_INPUT_RETURN]==1||Key[KEY_INPUT_NUMPADENTER]==1); } /* キャンセルキーが押されてるかどうか */ bool CancelKey() { return (Key[KeyConfig.k[5]]==1||Pad.key[5]==1||Key[KEY_INPUT_X]==1|| Key[KEY_INPUT_DELETE]==1||Key[KEY_INPUT_BACK]==1||Key[KEY_INPUT_ESCAPE]==1); }
マウスとキーボード
アクションゲームなどではマウスを使う機会がないと思うが、ボードゲームやRPG等は折角なのでマウスで操作できると便利である。プレイヤーはマウスとキーボードとパッドを極めて気分的に使い分けるため、全ての動作が三つで行えるとストレスレスに遊ぶことができる(ただししばしば存在するマウス限定操作を除く)。
具体的なソースコードは割愛するが、キーボードだけで操作できるものをマウスでも操作できるようにすることは簡単である。元々用意していたint Menuなどの値を、マウスの座標によって変動させてしまえば良い。逆に、マウスだけで操作していたものをキーボードで操作させるのは面倒くさい。MenuやMENU_MAXを作らなければならないからだ。もし両方実装するなら、キーボード操作前提で設計することをオススメする。