Microsoft DirectX 8.0 (Visual Basic) |
マウスからバッファリング データを取得するには、バッファ サイズを設定しなければならない (「デバイス プロパティ」を参照すること)。バッファのデフォルト サイズはゼロなので、この手順は不可欠である。
また、DIDEVICEOBJECTDATA 型の配列も宣言する必要がある。この配列は、最高でバッファ サイズと同数の要素を持つことができる。1 度の呼び出しでバッファの内容全体を取得する必要はない。配列内の 1 要素だけを保持して、バッファが空になるまで 1 つずつイベントを取得することができる。
デバイスの取得後は、DirectInputDevice8.GetDeviceData メソッドを使っていつでもバッファ内のイベントを調べたりフラッシュしたりすることができる (「バッファリング データと直接データ」を参照すること)。返された DIDEVICEOBJECTDATA 配列中の各要素は、マウスに対する単一オブジェクトの状態の変化を表す。たとえば、ユーザーがボタン 0 を押してマウスを斜めに移動すると、GetDeviceData に渡された配列 (3 つ以上の要素を持っている場合) は、3 つの要素が埋められる。これらの要素はそれぞれ、ボタン 0 の押下、x 軸の変化、および y 軸の変化を表す。メソッドの戻り値は 3 である。
配列中の要素がどのオブジェクトを指すかは、DIDEVICEOBJECTDATA 型の lOfs メンバを、CONST_DIMOUSEOFS 列挙の定数と比較することで確認できる。これらの各値は、DIMOUSESTATE 構造体または DIMOUSESTATE2 型中のオブジェクトに対するデータのオフセットから導かれる。たとえば、DIMOFS_BUTTON0 が返す値は、DIMOUSESTATE 型中の buttons(0) オフセットと等しい。DIMOFS_BUTTON4 から DIMOFS_BUTTON7 までは、DIMOUSESTATE2 に対してだけサポートされている。
デバイス オブジェクトの状態変化データは、DIDEVICEOBJECTDATA 型の lData メンバに格納される。軸の場合には、座標値がこのメンバ中に返される。ボタン オブジェクトの場合は、lData の下位バイトだけが有意である。上位ビットはボタンが押されたときに設定され、ボタンが離されたときに消去される。言い換えれば、(lData And &H80) がゼロでないとき、ボタンが押されていることになる。
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 ' Respond to left button pressed. Else ' Respond to left button released. End If End Select Next i