Microsoft DirectX 8.0 (C++) |
目的のマッピングが定義できたら、物理的デバイスに適用する必要がある。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 : アクション マップの構成と適用」で行う。