Platform SDK: DirectX |
マウスからバッファリング データを取得するには、バッファ サイズを設定しなければならない (「デバイス プロパティ」を参照すること)。バッファのデフォルト サイズはゼロなので、この手順は不可欠である。
また、DIDEVICEOBJECTDATA 構造体の配列も宣言する必要がある。この配列は、最大でバッファ サイズと同数の要素を持つことができる。1 度の呼び出しでバッファの内容全体を取得する必要はないが、配列内の 1 要素だけを保持して、バッファが空になるまで 1 つずつイベントを取得することができる。
デバイスの取得後は、IDirectInputDevice7::GetDeviceData メソッドを使っていつでもバッファ内のイベントを調べたりフラッシュしたりすることができる (「バッファリング データと直接データ」を参照すること)。返されたDIDEVICEOBJECTDATA 配列中の各要素は、マウスに対する単一オブジェクトの状態変化を表す。たとえば、ユーザーがボタン 0 を押してマウスを斜めに移動すると、GetDeviceData に渡された配列 (3 つ以上の要素を持っている場合、dwInOut は 3 以上) は、3 つの要素が埋められる。これらの要素はそれぞれ、ボタン 0 の押下、x 軸の変化、および y 軸の変化を表す。pdwInOut は 3 に設定される。
配列中の要素がどのオブジェクトを指すかは、DIDEVICEOBJECTDATA 構造体の dwOfs メンバを、以下のマクロによって返される値と比較することで確認できる。
これらの各値は、DIMOUSESTATE 構造体または DIMOUSESTATE2 構造体中のオブジェクトに対するデータのオフセットから導かれる。たとえば、DIMOFS_BUTTON0 が返す値は、DIMOUSESTATE 構造体中の rgbButtons[0] オフセットと等しい。マクロを使用して単純な比較を行い、どのデバイス オブジェクトがバッファの項目に関連しているかを決定することができる。たとえば、以下のとおりである。
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) がゼロでないとき、ボタンが押されていることになる。
DIDEVICEOBJECTDATA 構造体のほかのメンバの詳細については、「タイム スタンプとシーケンス番号」を参照すること。
また、DIDEVICEOBJECTDATA 型の配列も宣言する必要がある。この配列は、最大でバッファ サイズと同数の要素を持つことができる。1 度の呼び出しでバッファの内容全体を取得する必要はないが、配列内の 1 要素だけを保持して、バッファが空になるまで 1 つずつイベントを取得することができる。
デバイスの取得後は、DirectInputDevice.GetDeviceData メソッドを使っていつでもバッファ内のイベントを調べたりフラッシュしたりすることができる (「バッファリング データと直接データ」を参照すること)。返されたDIDEVICEOBJECTDATA 配列中の各要素は、マウスに対する単一オブジェクトの状態の変化を表す。たとえば、ユーザーがボタン 0 を押してマウスを斜めに移動すると、GetDeviceData に渡された配列 (3 つ以上の要素を持っている場合) は、3 つの要素が埋められる。これらの要素はそれぞれ、ボタン 0 の押下、x 軸の変化、および y 軸の変化を表す。メソッドの戻り値は 3 である。
配列中の要素がどのオブジェクトを指すかは、DIDEVICEOBJECTDATA 型の lOfs メンバを、CONST_DIMOUSEOFS 列挙内の定数と比較することで確認できる。これらの各値は、DIMOUSESTATE 型中のオブジェクトに対するデータのオフセットから導かれる。たとえば、DIMOFS_BUTTON0 が返す値は、DIMOUSESTATE 型中の buttons(0) オフセットと等しい。
デバイス オブジェクトの状態変化データは、DIDEVICEOBJECTDATA 型の lData メンバに格納される。軸の場合には、座標値がこのメンバ中に返される。ボタンオブジェクトでは、lData の下位バイトだけが有意であり、上位ビットはボタンが押されたときに設定され、ボタンが離されたときに消去される。言い換えれば、(lData & 0x80) がゼロでないとき、ボタンが押されていることになる。
DIDEVICEOBJECTDATA 型のほかのメンバの詳細については、「タイム スタンプとシーケンス番号」を参照すること。
次のコードは、バッファ (BufferSize 数の要素を含む) の内容全体を取得し、さまざまなイベントに応答する例である。
' objDIDev は DirectInputDevice オブジェクトである。 Dim diDeviceData(1 To BufferSize) As DIDEVICEOBJECTDATA Dim NumEvents As Integer Dim i As Integer NumEvents = objDIDev.GetDeviceData(diDeviceData, 0) For i = 1 To NumEvents Select Case diDeviceData(i).lOfs Case DIMOFS_X ' x 軸の移動に反応する。 Case DIMOFS_Y ' y 軸の移動に反応する。 Case DIMOFS_BUTTON0 If diDeviceData(i).lData And &H80 Then ' 左ボタン押下に反応する。 Else ' 左ボタン解放に反応する。 End If End Select Next i