Microsoft DirectX 8.0 (C++)

ジョイスティックのバッファリング データ

ジョイスティックからバッファリング データを取得するには、まず、バッファサイズを設定し (「デバイス プロパティ」を参照すること)、DIDEVICEOBJECTDATA 構造体の配列を宣言しなければならない。この配列は、最高でバッファ サイズと同数の要素を持つことができる。一度の呼び出しでバッファの内容全体を取得する必要はない。配列内の 1 要素だけを保持して、バッファが空になるまで 1 つずつイベントを取得することができる。

デバイスの取得後は、IDirectInputDevice8::GetDeviceData メソッドを使っていつでもバッファを調べたりフラッシュしたりすることができる (「バッファリング データと直接データ」を参照すること)。

DIDEVICEOBJECTDATA 配列中の各要素は、ジョイスティックに対する単一オブジェクトの状態の変化を表す。たとえば、ユーザーがボタン 0 を押してスティックを斜めに移動すると、GetDeviceData に渡された配列 (3 つ以上の要素を持っている場合、pdwInOut は 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 の追加メンバに表現されるデバイス オブジェクトには、独自のオフセットを設定する必要がある。

アクション マッピングを使用している場合は、dwOfs の値を無視し、キー イベントに関連するアプリケーション定義データを uAppData メンバから取得する。

デバイス オブジェクトの状態変化データは、DIDEVICEOBJECTDATA 構造体の dwData メンバに格納される。軸の場合には、座標値がこのメンバ中に返される。ボタン オブジェクトの場合は、dwData の下位バイトだけが有意である。上位ビットはボタンが押されたときに設定され、ボタンが離されたときに消去される。

ほかのメンバについては、「タイム スタンプとシーケンス番号」を参照すること。