Microsoft DirectX 8.0 (Visual Basic)

アクション データの取得

アクションをマップしたデバイスからバッファ データを取得するには、マップされていないデバイスの場合と同様に、DirectInputDevice8.GetDeviceData を呼び出す。ただし、DIDEVICEOBJECTDATA 型の lOfs メンバを検証することでデバイス オブジェクトを識別するのではなく、lUserData メンバからオブジェクトに関連付けられたアクションを取得する。これは、DIACTION 型内のデバイスに渡したのと同じ値である。

アクションは複数のデバイスへの関連付けが可能であることに注意すること。両方のデバイスから別個にデータを取得する必要があるが、データをどこから取得するかにかかわらず、同じルーチンを使ってデータを処理できる。

次のサンプル コードは、ドライビング シミュレーションのゲーム ループの一部とする。ここでは、m_Devices 配列内のすべてのデバイスからデータを取得する。この配列には m_nDevices 要素が格納されている。

Dim iDevice As Integer
For iDevice = 1 To m_nDevices
    Dim didod(BUFFERSIZE) As DIDEVICEOBJECTDATA

    ' データの有無をデバイスにポーリングする。
    m_Devices(iDevice).Poll

    ' 利用可能なデータの個数を判定する。
    m_nItems = m_Devices(iDevice).GetDeviceData(didod, 0)
            
    ' アクションを処理する。どのデバイスから返されたかは問わない。
    For i = 0 To m_nItems
        Select Case didod(i).lUserData
            Case eA_STEER:
                Call SteerCar (didod(i).lData)
            Case eB_UPSHIFT:
                If (didod(i).lData & &H80) Then
                    Call ShiftGears (UPSHIFT)
            .
            .
            .
        End Select
    Next
Next

 :  DIAXIS_DRIVINGR_STEER または DIAXIS_SPACESIM_LATERAL などの特定のジャンルの軸定数は、絶対的なジョイスティック データに対して使用される。アクション マッパーは、この仮想コントロールを絶対データを返すデバイス オブジェクトにマップする。アプリケーションでは、このデバイスから返されたデータを適切に処理する必要がある。ただし、DIMOUSE_XAXIS などのデバイス定数は、相対データを返すことが想定されている。

データを取得するときは、1 つのデバイス オブジェクが別のデバイス オブジェクトのデータを上書きしないように、各データ ソースを個別に処理する必要がある。たとえば、方向を制御する次の DIACTION 型はアクション マップで使用される。

With rgActions(0)
  .lAppData = INPUT_LEFTRIGHT_ABS_AXIS
  .lSemantic = DIAXIS_SPACESIM_LATERAL
  .lFlags = 0
  .ActionName = "Turn"
End With
With rgActions(1)
  .lAppData = INPUT_LEFTRIGHT_REL_AXIS
  .lSemantic = DIMOUSE_XAXIS
  .lFlags = 0
  .ActionName = "Turn"
End With
With rgActions(2)
  .lAppData = INPUT_TURNLEFT
  .lSemantic = DIKEYBOARD_LEFT
  .lFlags = 0
  .ActionName = "Turn left"
End With
With rgActions(3)
  .lAppData = INPUT_TURNRIGHT
  .lSemantic = DIKEYBOARD_RIGHT
  .lFlags = 0
  .ActionName = "Turn right"
End With

アプリケーションの入力ループでは、次の case ステートメントでこれらのアクションのデータを処理する。

Select Case adod(j).lUserData
    Case INPUT_LEFTRIGHT_ABS_AXIS:
        g_dwAbsLR = adod(j).lData
    Case INPUT_LEFTRIGHT_REL_AXIS:
        g_dwRelLR = adod(j).lData
    Case INPUT_TURNLEFT:
        g_bLeft = (adod(j).lData <> 0)
    case INPUT_TURNRIGHT:
        g_bRight = (adod(j).lData <> 0)
End Select

データ ソースの割り当てに関して、すべてのデータ ソースが 1 つの汎用の "turn" 変数に割り当てられるのではなく、各データ ソースが個別の変数に割り当てられることに注意すること。データ ソースが汎用の変数を共有する場合、左矢印 (←) キーを押したままジョイスティックを移動すると、キーボード情報が失われる。これは、ジョイスティック データが汎用の変数を上書きするからである。

変数に対してと同様に、データに対してもさまざまな処理方法がある。どのような処理方法を使用する場合でも、予期しない情報の損失を避けるためにデータの処理には注意する必要がある。