Windowsアプリケーションでは、次のようにキーの入力状態を取得していた。
- WindowsからWM_KEYDOWNメッセージを受け取る。
- どのキーが押されたかをパラメータから調べる。
しかしこの方法ではWinProc関数内に処理を記述しなければならないため、ゲームプログラムには不向きである。そこで、メッセージを使わず、
WindowsAPIを使ってキーボードの状態を取得することを考える。
WindowsAPIで用意されている関数は次の2つである。
- GetAsyncKeyState関数
- GetKeyboardState関数
- 1.引数
- int型。通常は仮想キー値(VK_LEFTなど)を与える。
- 2.戻り値
- shortint型。
- 3.機能
- 引数に指定されたキーを調べ、該当するキーが押されていれば、最上位ビットがONの値を返す。
《使用例》
if (GetAsyncKeyState(VK_SPACE) & 0x8000)
スペースキーが押されているときの処理;この関数を利用する場合、キーの状態を複数の関数で利用する場合、そのつどこの関数を実行するため、効率が悪い(かもしれない)。ゲーム・ループの最初で調べたいキーを全て調べて変数に格納し、その変数の値をほかの様々な関数で参照するという手はあるが・・・
- 1.引数
- unsigned char型の256個の要素を持つ配列(のアドレス)。
- 2.戻り値
- int型。関数呼び出しが成功すると0以外の値を返す。
- 3.機能
- キーボード上の全てのキーを調べ、押されているキーがあると、そのキーの仮想番号に対応する要素の値の先頭1ビットがONになる。
《使用例》
BYTE KeyTbl[256];
if (!GetKeyboardState(KeyTbl))
return;GetKeyboardState関数の呼び出しが成功すると、KeyTbl配列に全てのキーの状態が格納される。どのキーが押されているかを調べるには、調べたいキーの要素の値の先頭1ビットに1が立っているかどうかを調べればよい。
例えばリターンキーが押されているかどうかは次のように調べる。
if (KeyTbl[VK_RETURN] & 0x80)
リターンキーが押されているときの処理;このやり方では調べたくないキーの情報も取得してしまうが、この関数の呼び出しはゲーム・ループの最初で一度だけ行えばよい。実習で使用する基本プログラムはこちらを採用している。
WindowsAPI関数ではなく、
DirectInputを使ってキーボードの情報を取得することもできる。DirectInputはキーボードやマウス、ジョイスティックなどを制御できる関数群である。興味のある人は「VC++でDirectX7 実習編」を参考にしてください。
座学としては相当あとに取り上げる予定です。
5-2の方法を使い、キーボード状態を取得する処理を追加する。手順は次のとおり。
- グローバル変数に、キーボードの状態を格納する変数を宣言する。
BYTE KeyTbl[256]; - UpdateFrame関数の一番上に、以下のプログラムを追加する。
/* 現在のキー情報を取得 */
if (!GetKeyboardState(KeyTbl)) return;※取得した情報は、それぞれの場面の関数で利用する