Platform SDK: DirectX |
ジョイスティックからバッファリング データを取得するには、まず、バッファサイズを設定し (「デバイス プロパティ」を参照すること)、DIDEVICEOBJECTDATA 構造体の配列を宣言しなければならない。この配列は、最高でバッファ サイズと同数の要素を持つことができる。1 度の呼び出しでバッファの内容全体を取得する必要はないが、配列内の 1 要素だけを保持して、バッファが空になるまで 1 つずつイベントを取得することができる。
デバイスの取得後は、IDirectInputDevice7::GetDeviceData メソッドを使っていつでもバッファを調べたりフラッシュしたりすることができる (「バッファリング データと直接データ」を参照すること)。
DIDEVICEOBJECTDATA 配列中の各要素は、ジョイスティックに対する単一オブジェクトの状態の変化を表す。たとえば、ユーザーがボタン 0 を押してスティックを斜めに移動すると、GetDeviceData に渡された配列 (3 つ以上の要素を持っている場合、dwInOut は 3 以上) は、3 つの要素が埋められる。これらの要素はそれぞれ、ボタン 0 の押下、x 軸の変化、および y 軸の変化を表す。pdwInOut は 3 に設定される。
配列中の要素がどのオブジェクトを指すかは、以下の値と、DIDEVICEOBJECTDATA 構造体の dwOfs メンバを比較することにより決定できる。
これらのそれぞれの値は、DIJOYSTATE 構造体中のオブジェクトに対するデータのオフセットと等しい。たとえば、DIJOFS_BUTTON0 は、DIJOYSTATE 構造体中の rgbButtons[0] オフセットと等しい。単純な比較を行うことで、どのデバイス オブジェクトがバッファ上の項目に関連しているかを確認することができる。たとえば、以下のとおりである。
DIDEVICEOBJECTDATA *lpdidod; int n; . . . /* JoyBuffer は、DIDEVICEOBJECTDATA 構造体の配列であり、 GetDeviceData への呼び出しによって設定される。 n は、配列中で埋め込まれたすべての要素を 調べるループで増加する */ */ lpdidod = &JoyBuffer[n]; if (( (int) lpdidod->dwOfs == DIJOFS_BUTTON0) && (lpdidod->dwData & 0x80)) { ; // 主ボタンの押下に応じて、何らかの処理を行う。 }
データ形式が c_dfDIJoystick2 で設定された場合は、DIJOYSTATE 内に存在するすべてのデバイス オブジェクトに事前定義されたオフセットを使用することができる。ただし、DIJOYSTATE2 の追加メンバに表現されるデバイス オブジェクトには、独自のオフセットを設定する必要がある。
デバイス オブジェクトの状態変化データは、DIDEVICEOBJECTDATA 構造体の dwData メンバに格納される。軸の場合には、座標値がこのメンバ中に返される。ボタン オブジェクトの場合には、dwData の下位バイトだけが有意である。このバイトの上位ビットは、ボタンが押された場合に設定され、ボタンが離された場合に消去される。
ほかのメンバについては、「タイム スタンプとシーケンス番号」を参照すること。
ジョイスティックからバッファリング データを取得するには、まず、バッファサイズを設定し (「デバイス プロパティ」を参照すること)、DIDEVICEOBJECTDATA 型の配列を宣言しなければならない。この配列は、最高でバッファ サイズと同数の要素を持つことができる。1 度の呼び出しでバッファの内容全体を取得する必要はないが、配列内の 1 要素だけを保持して、バッファが空になるまで 1 つずつイベントを取得することができる。
デバイスの取得後は、DirectInputDevice.GetDeviceData メソッドを使っていつでもバッファ内のイベントを調べたりフラッシュしたりすることができる (「バッファリング データと直接データ」を参照すること)。
DIDEVICEOBJECTDATA 配列中の各要素は、ジョイスティックに対する単一オブジェクトの状態の変化を表す。たとえば、ユーザーがボタン 0 を押してスティックを斜めに移動すると、GetDeviceData に渡された配列 (3 つ以上の要素を持っている場合) には、3 つの要素が埋められる。これらの要素はそれぞれ、ボタン 0 の押下、x 軸の変化、および y 軸の変化を表す。メソッドの戻り値は 3 である。
配列中の要素がどのオブジェクトを指すかは、DIDEVICEOBJECTDATA 型の lOfs メンバを、CONST_DIJOYSTICKOFS 列挙内の定数と比較することで確認できる。これらのそれぞれの値は、DIJOYSTATE 型中のオブジェクトに対するデータのオフセットと等しい。たとえば、DIJOFS_BUTTON0 が返す値は、DIJOYSTATE 型中の buttons(0) オフセットと等しい。
データ形式が DIFORMAT_JOYSTICK2 で設定された場合は、DIJOYSTATE 内に存在するすべてのデバイス オブジェクトのオフセット定数を使用することができる。ただし、DIJOYSTATE2 の追加メンバに表現されるデバイス オブジェクトには、独自のオフセットを設定する必要がある。この型の内部構造は、Dinput.h ヘッダー ファイルに含まれる同名の C++ 構造体と同じである。
デバイス オブジェクトの状態変化データは、DIDEVICEOBJECTDATA 型の lData メンバに格納される。軸の場合には、座標値がこのメンバ中に返される。ボタン オブジェクトの場合には、lData の下位バイトだけが有意である。このバイトの上位ビットは、ボタンが押された場合に設定され、ボタンが離された場合に消去される。
ほかのメンバについては、「タイム スタンプとシーケンス番号」を参照すること。