Microsoft DirectX 8.0 (C++) |
マウスからバッファリング データを取得するには、バッファ サイズを設定しなければならない (「デバイス プロパティ」を参照すること)。バッファのデフォルト サイズはゼロなので、この手順は不可欠である。
また、DIDEVICEOBJECTDATA 構造体の配列も宣言する必要がある。この配列は、最高でバッファ サイズと同数の要素を持つことができる。1 度の呼び出しでバッファの内容全体を取得する必要はない。配列内の 1 要素だけを保持して、バッファが空になるまで 1 つずつイベントを取得することができる。
デバイスの取得後は、IDirectInputDevice8::GetDeviceData メソッドを使っていつでもバッファ内のイベントを調べたりフラッシュしたりすることができる (「バッファリング データと直接データ」を参照すること)。返された DIDEVICEOBJECTDATA 配列中の各要素は、マウスに対する単一オブジェクトの状態の変化を表す。たとえば、ユーザーがボタン 0 を押してマウスを斜めに移動すると、GetDeviceData に渡された配列 (3 つ以上の要素を持っている場合、pdwInOut は 3 以上) は、3 つの要素が埋められる。これらの要素はそれぞれ、ボタン 0 の押下、x 軸の変化、および y 軸の変化を表す。pdwInOut は 3 に設定される。
配列中の要素がどのオブジェクトを指すかは、DIDEVICEOBJECTDATA 構造体の dwOfs メンバを、以下のマクロによって返される値と比較することで確認できる。
これらの各値は、DIMOUSESTATE 構造体または DIMOUSESTATE2 構造体中のオブジェクトに対するデータのオフセットから導かれる。たとえば、DIMOFS_BUTTON0 が返す値は、DIMOUSESTATE 構造体中の rgbButtons[0] オフセットと等しい。DIMOFS_BUTTON4 から DIMOFS_BUTTON7 までは、DIMOUSESTATE2 に対してだけサポートされている。マクロを使用して単純な比較を行い、どのデバイス オブジェクトがバッファの項目に関連しているかを決定することができる。たとえば、以下のとおりである。
DIDEVICEOBJECTDATA *lpdidod; int n; . . . /* MouseBuffer は、DIDEVICEOBJECTDATA 構造体の配列であり、 GetDeviceData への呼び出しによって設定される。 n は、配列中で埋め込まれたすべての要素を 調べるループで増加する。 */ lpdidod = &MouseBuffer[n]; if (( (int) lpdidod->dwOfs == DIMOFS_BUTTON0) && (lpdidod->dwData & 0x80)) { ; // 左ボタン押下に応じて何らかの処理を行う。 }
デバイス オブジェクトの状態変化データは、DIDEVICEOBJECTDATA 構造体の dwData メンバに格納される。軸の場合には、座標値がこのメンバ中に返される。ボタン オブジェクトの場合は、dwData の下位バイトだけが有意である。上位ビットはボタンが押されたときに設定され、ボタンが離されたときに消去される。言い換えれば、(dwData & 0x80) がゼロでないとき、ボタンが押されていることになる。
アクション マッピングを使用している場合は、dwOfs の値を無視し、キー イベントに関連するアプリケーション定義データを uAppData メンバから取得する。
DIDEVICEOBJECTDATA 構造体のほかのメンバの詳細については、「タイム スタンプとシーケンス番号」を参照すること。