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" 変数に割り当てられるのではなく、各データ ソースが個別の変数に割り当てられることに注意すること。データ ソースが汎用の変数を共有する場合、左矢印 (←) キーを押したままジョイスティックを移動すると、キーボード情報が失われる。これは、ジョイスティック データが汎用の変数を上書きするからである。
変数に対してと同様に、データに対してもさまざまな処理方法がある。どのような処理方法を使用する場合でも、予期しない情報の損失を避けるためにデータの処理には注意する必要がある。