ステップ 6 :キーボードからのデータの取得
ステップ 6 :キーボードからのデータの取得
アプリケーションは、デバイスを取得した後にデバイスからのデータの取得を開始できる。このための最も簡単な方法は、IDirectInputDevice8::GetDeviceState メソッドを呼び出すことである。このメソッドは、呼び出し時のデバイスの状態のスナップショットを取得する。
IDirectInputDevice8::GetDeviceState メソッドは 2 つの引数をとる。デバイス状態データが設定されるバッファのサイズと、そのバッファへのポインタである。キーボードの場合は、常に、符号なし 256 バイトのバッファを宣言する。
以下のコードは、キーボードの状態を取得しようとする例である。取得に失敗した場合、アプリケーション定義のサンプル関数を呼び出し、既存の Microsoft® DirectInput® オブジェクトがある場合は、その割り当てを解除する。詳細については、「サンプル関数 2 :DI_Term」を参照すること。
キーボードの現在の状態を取得した後、アプリケーションは、呼び出し時に押された特定のキーに応答することができる。バッファ中の各要素が 1 つのキーを表す。要素の上位ビットが 1 の場合、そのキーは、呼び出し時に押されていたことを示す。それ以外の場合は、キーは押されていない。特定のキーの状態をチェックするには、DirectInput のキーボード デバイスを使って、そのキーに対するバッファのインデックスを作成する。
以下のコードは、仮想の宇宙船ゲームのメイン ループから呼び出されるスケルトン関数である。ここでは、IDirectInputDevice8::GetDeviceState メソッドを使ってキーボードをポーリングする。次に、デバイス状態を取得したときに、左向き矢印、右向き矢印、上向き矢印、または下向き矢印の各キーが押されたかどうかをチェックする。このためには、この関数の本体で定義されている KEYDOWN マクロを使う。このマクロは、バッファの変数名とインデックス値を受け取った後、指定インデックスに位置するバイトをチェックして上位ビットが設定されているかどうかを調べ、設定されている場合は TRUE を返す。
void WINAPI ProcessKBInput()
{
#define KEYDOWN(name, key) (name[key] & 0x80)
char buffer[256];
HRESULT hr;
hr = g_lpDIDevice->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
if FAILED(hr)
{
// If it failed, the device has probably been lost.
// Check for (hr == DIERR_INPUTLOST)
// and attempt to reacquire it here.
return;
}
// Turn the spaceship right or left
if (KEYDOWN(buffer, DIK_RIGHT));
// Turn right.
else if(KEYDOWN(buffer, DIK_LEFT));
// Turn left.
// Thrust or stop the spaceship
if (KEYDOWN(buffer, DIK_UP)) ;
// Move the spaceship forward.
else if (KEYDOWN(buffer, DIK_DOWN));
// Stop the spaceship.
}
アプリケーションがキーボードからのデータを取得したら、「ステップ 7 :DirectInput システムの終了」に進むこと。