Microsoft DirectX 8.0 (C++)

アクション データの取得

アクションをマップしたデバイスからバッファ データを取得するには、マップされていないデバイスの場合と同様に、IDirectInputDevice8::GetDeviceData を呼び出す。ただし、DIDEVICEOBJECTDATA 構造体の dwOfs メンバを検証することでデバイス オブジェクトを識別するのではなく、uAppData メンバからオブジェクトに関連付けられたアクションを取得する。これは、DIACTION 構造体内のデバイスに渡したのと同じ値である。この値には、単純な識別子や、アクションの処理を目的とした関数へのポインタを使用できる。

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

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

for (int iDevice = 0x0; iDevice < g_nDevices; iDevice++)
{
    DIDEVICEOBJECTDATA didod;
    DWORD dwObjCount = 1;
 
    // データの有無をデバイスにポーリングする。 
    g_lpDiDevices[iDevice]->Poll(); 
    
    // データを取得する。
    g_lpDiDevices[iDevice]->GetDeviceData( sizeof(didod),
                                           &didod,
                                           &dwObjCount, 0 );
 
    // アクションを処理する。どのデバイスから返されたかは問わない。
    switch(didod.uAppData)
    {
        case eA_STEER:
            SteerCar(didod.dwData);
            break;
        case eB_UPSHIFT
            if (didod.dwData & 0x80) ShiftGears(UPSHIFT);
            break;
        .
        .
        .
 
        default:
            break;
    }
}

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

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

{INPUT_LEFTRIGHT_ABS_AXIS, DIAXIS_SPACESIM_LATERAL, 0,   _T("Turn"),},
{INPUT_LEFTRIGHT_REL_AXIS, DIMOUSE_XAXIS,           0,   _T("Turn"),},
{INPUT_TURNLEFT,           DIKEYBOARD_LEFT,     0,  _T("Turn left"),},
{INPUT_TURNRIGHT,          DIKEYBOARD_RIGHT,    0, _T("Turn right"),},

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

switch (adod[j].uAppData)
{
    case INPUT_LEFTRIGHT_ABS_AXIS:
        g_dwAbsLR = adod[j].dwData
        break;
    case INPUT_LEFTRIGHT_REL_AXIS:
        g_dwRelLR = adod[j].dwData;
        break;
    case INPUT_TURNLEFT:
        g_bLeft = (adod[j].dwData != 0);
        break;
    case INPUT_TURNRIGHT:
        g_bRight = (adod[j].dwData != 0)
        break;
}

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

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