第2章 Windowsプログラムをゲーム用に改造する

2-5 キーボードの状態を取得する(WindowsAPI)

Windowsアプリケーションでは、次のようにキーの入力状態を取得していた。

  1. WindowsからWM_KEYDOWNメッセージを受け取る。
  2. どのキーが押されたかをパラメータから調べる。

しかしこの方法ではWinProc関数内に処理を記述しなければならないため、ゲームプログラムには不向きである。そこで、メッセージを使わず、WindowsAPIを使ってキーボードの状態を取得することを考える。
WindowsAPIで用意されている関数は次の2つである。

  1. GetAsyncKeyState関数
  2. GetKeyboardState関数

(a) GetAsyncKeyState関数の使い方

1.引数
int型。通常は仮想キー値(VK_LEFTなど)を与える。
2.戻り値
shortint型。
3.機能
引数に指定されたキーを調べ、該当するキーが押されていれば、最上位ビットがONの値を返す。

《使用例》

if (GetAsyncKeyState(VK_SPACE) & 0x8000)
  スペースキーが押されているときの処理;

この関数を利用する場合、キーの状態を複数の関数で利用する場合、そのつどこの関数を実行するため、効率が悪い(かもしれない)。ゲーム・ループの最初で調べたいキーを全て調べて変数に格納し、その変数の値をほかの様々な関数で参照するという手はあるが・・・

(b) GetKeyboardState関数の使い方

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)
  リターンキーが押されているときの処理;

このやり方では調べたくないキーの情報も取得してしまうが、この関数の呼び出しはゲーム・ループの最初で一度だけ行えばよい。実習で使用する基本プログラムはこちらを採用している。

(c) その他の手法

WindowsAPI関数ではなく、DirectInputを使ってキーボードの情報を取得することもできる。DirectInputはキーボードやマウス、ジョイスティックなどを制御できる関数群である。興味のある人は「VC++でDirectX7 実習編」を参考にしてください。
座学としては相当あとに取り上げる予定です。

(d) UpdateFrame関数にキーボード状態を取得する処理を追加する

5-2の方法を使い、キーボード状態を取得する処理を追加する。手順は次のとおり。

  1. グローバル変数に、キーボードの状態を格納する変数を宣言する。
    BYTE KeyTbl[256];
  2. UpdateFrame関数の一番上に、以下のプログラムを追加する。
    /* 現在のキー情報を取得 */
    if (!GetKeyboardState(KeyTbl)) return;

※取得した情報は、それぞれの場面の関数で利用する


[ TOP ] [ Next ]