Microsoft DirectX 8.0 (C++)

ステップ 6 : キーボードからのデータの取得

デバイスを取得すれば、アプリケーションは、デバイスからのデータの取得を開始できる。データを取得する最も簡単な方法は、IDirectInputDevice8::GetDeviceState メソッドを呼び出すことである。このメソッドは、デバイスを呼び出したときの瞬間の状態を取得する。

GetDeviceState メソッドは 2 つのパラメータを取る。デバイス状態データが設定されるバッファのサイズと、そのバッファへのポインタである。キーボードの場合は、常に、符号なし 256 バイトのバッファを宣言する。

以下のコードは、キーボードの状態を取得しようとする例である。取得に失敗した場合、アプリケーション定義のサンプル関数を呼び出し、既存の Microsoft® DirectInput® オブジェクトがあれば、その割り当てを解除する。「サンプル関数 2 : DI_Term」を参照すること。

キーボードの現在の状態を取得した後、アプリケーションは、呼び出し時に押された特定のキーに応答することができる。バッファ中の各要素が 1 つのキーを表す。要素の上位ビットが 1 の場合、そのキーは、呼び出し時に押されていたことを示す。それ以外の場合は、キーは押されていない。あるキーの状態をチェックするには、DirectInput のキーボード デバイス定数を使用して、そのキーに対するバッファのインデックスを作成する。

以下のコードは、ある仮想の宇宙船ゲームのメイン ループから呼び出されるスケルトン関数である。ここでは、IDirectInputDevice8::GetDeviceState メソッドを使用してキーボードをポーリングする。次に、デバイス状態を取得したときに、左向き矢印、右向き矢印、上向き矢印、または下向き矢印の各キーが押されたかどうかをチェックする。これを行うには、この関数の本体で定義されている KEYDOWN マクロを使用する。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) 
    { 
         // 失敗の場合、デバイスは失われている。 
         // (hr == DIERR_INPUTLOST) をチェックし、
         // 再取得を試みる必要がある。 
         return; 
    } 
 
    // 船を右または左に向ける。
    if (KEYDOWN(buffer, DIK_RIGHT)); 
        // 右に向ける。 
    else if(KEYDOWN(buffer, DIK_LEFT)); 
        // 左に向ける。 
 
    // 船を進める、または停止させる。
    if (KEYDOWN(buffer, DIK_UP)) ; 
        // 船を前進させる。 
    else if (KEYDOWN(buffer, DIK_DOWN)); 
        // 船を停止させる。 
} 

アプリケーションがキーボードからのデータを取得したら、「ステップ 7 : DirectInput システムの終了」に進む。