Platform SDK: DirectX

ステップ 4 : ジョイスティックの動作の設定

[Visual Basic]

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

[C++]

これまでに、ジョイスティック デバイスの作成とデバイスのデータ形式の設定が完了している。次は、デバイスの協調レベルを設定することである。Space Donuts サンプルでは、この処理は、デバイスが列挙されたときにコールバック関数で行われる。前のステップと同様に、pdev はデバイス インターフェイスへのポインタである。

   if(pdev->lpVtbl->SetCooperativeLevel(pdev, hWndMain, 
      DISCL_NONEXCLUSIVE | DISCL_FOREGROUND) != DI_OK) 
   { 
      OutputDebugString("IDirectInputDevice7::SetCooperativeLevel 
                         FAILED\n"); 
      pdev->lpVtbl->Release(pdev); 
      return DIENUM_CONTINUE; 
   } 
 

ここでも、IDirectInputDevice7::SetCooperativeLevel の第 1 パラメータは、呼び出し側オブジェクトに対するポインタである。

第 2 パラメータは、ウィンドウ ハンドルである。この場合、メイン プログラムのウィンドウ ハンドルが渡される。

最後のパラメータは、必要な協調レベルを指定するフラグの組み合わせである。Space Donuts サンプルがジョイスティックからの入力を要求するのは、フォアグラウンド アプリケーションの場合のみであり、別のプログラムが排他モードでジョイスティックを使用しているかどうかには注意を払わない。したがって、フラグには DISCL_NONEXCLUSIVE | DISCL_FOREGROUND が設定される (これらのフラグの詳細については、「協調レベル」を参照)。

最終手順は、デバイスのプロパティを設定することであり、コールバック関数で列挙されている各ジョイスティックに対して実行される。サンプルでは、変更されるプロパティに x 軸と y 軸の両方の範囲とデッド ゾーンが含まれている。

範囲を設定することにより、返させたい軸の最大値と最小値が何であるかを DirectInput に指示することになる。例のように、x 軸に対して範囲 -1,000 から +1,000 を設定すると、ジョイスティックが最左端にある場合に値 -1,000 を、最右端にある場合に +1,000 を、中央にある場合にゼロをそれぞれ返すことを要求することになる。

デッド ゾーンは、軸の中間にある許容領域であり、軸移動の物理的範囲の 10,000 分の 1 単位で測定される。x 軸に対して 1,000 のデッド ゾーンを設定すると、スティックを中心位置から軸移動範囲の 10 分の 1 だけ左右に移動しても、スティックは中心にあるとみなされることを示す。無効ゾーンの詳細については、「ジョイスティック軸データの解釈」を参照すること。

以下は、x 軸の範囲を設定するコードである。

   DIPROPRANGE diprg; 
 
   diprg.diph.dwSize       = sizeof(diprg); 
   diprg.diph.dwHeaderSize = sizeof(diprg.diph); 
   diprg.diph.dwObj        = DIJOFS_X; 
   diprg.diph.dwHow        = DIPH_BYOFFSET; 
   diprg.lMin              = -1000; 
   diprg.lMax              = +1000; 
 
   if FAILED(pdev->lpVtbl->SetProperty(pdev, 
                   DIPROP_RANGE, &diprg.diph)) 
   { 
      OutputDebugString("IDirectInputDevice7::SetProperty(DIPH_RANGE) 
                         FAILED\n"); 
      pdev->lpVtbl->Release(pdev); 
      return FALSE; 
   } 
 

ここでは最初に、DIPROPRANGE 構造体 diprg を設定する。その構造体のアドレスは、IDirectInputDevice7::SetProperty メソッドに渡される。実際には、構造体自体のアドレスが渡されるのではなく、その最初のメンバのアドレスが渡される。最初のメンバとは、1 つの DIPROPHEADER 構造体である。詳細については、「デバイス プロパティ」を参照すること。

プロパティ ヘッダーは、以下の値で初期化される。

DIPROPRANGE 構造体の lmin lmax メンバに必要な範囲値を割り当てる。

アプリケーションは、ここで IDirectInputDevice7::SetProperty メソッドを呼び出す。これまでと同様に、第 1 パラメータは、呼び出し側オブジェクトに対するポインタである。第 2 パラメータは、どのプロパティを変更するのかを示すフラグである。第 3 パラメータは、プロパティ構造体の DIPROPHEADER メンバのアドレスである。

x 軸の無効ゾーンの設定も同様にして行える。Space Donuts サンプルは、ヘルパー関数 SetDIDwordProperty を使用して、DIPROPDWORD プロパティ構造体を初期化する。DIPROPRANGE とは異なり、この構造体には、例では 5,000 が設定されているデータ メンバが 1 つしか含まれていない。この値は、軸が中心からその範囲の半分を動かなければ軸が中心を離れたとは報告されないことを示す。

   // X 軸の無効ゾーンを 50% に設定する (不測の転回を避けるため)。
   if FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_X, 
                                DIPH_BYOFFSET, 5000)) 
   { 
      OutputDebugString("IDirectInputDevice7:: 
                           SetProperty(DIPH_DEADZONE) FAILED\n"); 
      pdev->lpVtbl->Release(pdev); 
      return FALSE; 
   } 

次項 : ステップ 5 : ジョイスティックへのアクセス権の取得