Platform SDK: DirectX

ステップ 6 : ジョイスティックからのデータを取得

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectInput Visual Basic チュートリアル」を参照すること。

[C++]

アプリケーションでは、ジョイスティック軸の移動よりも、ジョイスティック軸の位置の方が重要であることが多いので、デバイスからは、バッファリング データよりも直接データを取得することがよく行われる。直接データは、IDirectInputDevice7::GetDeviceState でポーリングすることによって取得できる。デバイス状態が変化したとき、すべてのデバイス ドライバが DirectInput に通知するとは限らないので、デバイス状態をチェックする前に IDirectInputDevice7::Poll メソッドを呼び出すことは常に適切な処置である。

Space Donuts アプリケーションは、ジョイスティックがアクティブな入力デバイスであるという前提で、レンダリング ループを使って、各パスについて下記の関数を呼び出す。

DWORD ReadJoystickInput(void) 
{ 
    DWORD                   dwKeyState; 
    HRESULT                 hRes; 
    DIJOYSTATE              js; 
 
    // 現在の状態を読み取るジョイスティックをポーリングする。
    hRes = IDirectInputDevice7_Poll(g_pdevCurrent);
 
    // ジョイスティックからデータを入力する。
    hRes = IDirectInputDevice7_GetDeviceState(g_pdevCurrent, 
                                            sizeof(DIJOYSTATE), &js); 
 
    if (hRes != DI_OK) 
    { 
        // 何らかの理由で入力を失ったために読み取りが失敗したのか?
        // そうなら再取得を試みる。これも失敗したなら、
        // GetDeviceData からのエラーは、DIERR_NOTACQUIRED である。
        // この結果、無限ループに陥らないで済む。
        if(hRes == DIERR_INPUTLOST) 
            ReacquireInput(); 
 
        // データがまったく読み取れなかったという事実が返される。
        return 0; 
    } 
 
    // スティックとボタンの位置を調べる。
 
    dwKeyState = 0; 
    if (js.lX < 0) { 
        dwKeyState |= KEY_LEFT; 
    } else if (js.lX > 0) { 
        dwKeyState |= KEY_RIGHT; 
    } 
 
    if (js.lY < 0) { 
        dwKeyState |= KEY_UP; 
    } else if (js.lY > 0) { 
          dwKeyState |= KEY_DOWN; 
   } 
 
    if (js.rgbButtons[0] & 0x80) { 
        dwKeyState |= KEY_FIRE; 
    } 
 
    if (js.rgbButtons[1] & 0x80) { 
        dwKeyState |= KEY_SHIELD; 
    } 
 
    if (js.rgbButtons[2] & 0x80) { 
        dwKeyState |= KEY_STOP; 
    } 
 
    return dwKeyState; 
} 
 

IDirectInputDevice7_Poll および IDirectInputDevice7_GetDeviceState への呼び出しに注意すること。これらは、対応するメソッドへの C の呼び出しを展開するマクロであり、このチュートリアルの前のステップに出てきたマクロに類似している。このマクロへのパラメータは、メソッドへ渡すパラメータと同じである。この点は、GetDeviceState への呼び出しに類似している。

    hRes = IDirectInputDevice7_GetDeviceState(g_pdevCurrent, 
                                             sizeof(DIJOYSTATE), &js); 
 

1 番目のパラメータは、呼び出し側オブジェクトに対するポインタである。第 2 パラメータは、データが返される構造体のサイズである。最後のパラメータは、DIJOYSTATE 型であるこの構造体のアドレスである。この構造体は、最高 6 つの軸、32 のボタン、および 1 つの視点ハットを保持する。サンプル プログラムでは、2 つの軸と 3 つのボタンの状態を確認する。

軸の位置がゼロ以外と報告された場合、その軸は無効ゾーンの外側にあるので、関数は、dwKeyState 変数を適切に設定して応答する。この変数は、キーボードまたはジョイスティックのいずれかで入力された現在のユーザー コマンドのセットを保持する。たとえば、ジョイスティックの x 軸がゼロより大きければ、右向き矢印キーが押されているとみなされる。

ジョイスティック ボタンは、キーまたはマウス ボタンとまったく同じように機能する。戻り値バイトの上位ビットが設定されていれば、ボタンがダウン状態であることを示す。