Microsoft DirectX 8.0 (C++)

ステップ 3 : デバイスへのアクションのマッピング

目的のマッピングが定義できたら、物理的デバイスに適用する必要がある。IDirectInput8::EnumDevicesBySemantics は、次のコードでこのプロセスを開始する。ここで、m_pDI は以前に定義された IDirectInput8 オブジェクトである。

HRESULT hr;
hr = m_pDI->EnumDevicesBySemantics(m_strUserName, &m_diaf, 
                                EnumSuitableDevicesCB, this, 0L);

最初のパラメータ m_strUserName は、マッピングの設定が異なる複数のユーザーを対象とする場合に有用である。ただし、この例ではこの値には NULL を設定し、現在システムにログオンされているユーザーを示す。

第 2 パラメータは、マッピング情報を格納する DIACTIONFORMAT 構造体のアドレスである。

第 3 パラメータは、システム上でデバイスが見つかるたびに呼び出されるコールバック関数のアドレスである。サンプルで使用されている関数は、DIEnumDevicesBySemanticsCallback 関数に基づいている。

第 4 パラメータは、コールバック関数が使用できる任意の 32 ビット値である。この例では this ポインタであり、これは、MultiMapper サンプルで、いろいろなアクション マッピングの設定および操作の関数に使用されているクラス オブジェクトを指すポインタである。これによって、コールバック関数はクラスの関数へのアクセスを取得する。

最後のパラメータはフラグに使用される。この例ではフラグは使用されていない。

EnumSuitableDevicesCB コールバック関数がアプリケーション定義の関数AddDevices を呼び出し、次にこの関数が現在列挙されようとしているデバイス pdidDevice IDirectInputDevice8::BuildActionMap 関数を呼び出す。次のコードは、この呼び出しを示している。

hr = pdidDevice->BuildActionMap( &m_diaf, m_strUserName, 0L );

ここでも最初のパラメータは、アクション マップを格納する DIACTIONFORMAT 構造体である。

第 2 パラメータも同じくユーザー名を指定できるが、ここでは NULL を指定する。

最後のパラメータは制御フラグを保持する。この例ではフラグは渡されない。

BuildActionMap は、DIACTIONFORMAT 構造体に指定されたコントロールの割り当て一覧を取得し、それを、列挙されているデバイスの指定されたデバイス オブジェクトへのマッピングを試みる。マッピングの結果は、同じ構造体に返される。渡すたびに、現在調べられている列挙デバイスの性質に応じて、異なるコントロールにマッピングされる。たとえばキーボードは、特定のキーへのマッピングを指定するコントロールをマッピングするが、ボタン、スライダ、または軸を指定するコントロールについてはマッピングしない。次にジョイスティックが列挙された場合、BuildActionMap はキーボードのキーにマッピングされたコントロールは無視するが、ボタン、スライダ、軸はジョイスティックのデバイス オブジェクトへのマッピングを試みる。

このデフォルト マッピングの結果を調べ、操作することができる。これは、「ステップ 4 : アクション マップの構成と適用」で行う。