アクション マップの構成
アクション マップの構成
各デバイスが列挙されたら、そのデバイスへのポインタの取得、デフォルト アクション マップの取得、デフォルト マップへの変更、最終マッピングの適用を行うことができる。
1. デバイスの取得
列挙コールバックの lpdid パラメータから、列挙された各デバイスの IDirectInputDevice8 インターフェイス ポインタを取得する。「DIEnumDevicesBySemanticsCallback」を参照すること。アプリケーションで使えるようにデバイス インターフェイスを保存したい場合は、そのインターフェイス ポインタに対して AddRef を呼び出し、グローバル変数を割り当てる。
2. デフォルト アクション マップの取得
Microsoft® DirectInput® は、デバイスのデフォルト アクションを取得するために、IDirectInputDevice8::BuildActionMap を呼び出す。次に、DIACTIONFORMAT 構造体に指定された仮想コントロールのリストを取り出し、これらのコントロールを物理デバイス オブジェクトにマップしようとする。結果は同じ構造体に返される。それぞれの DIACTION 要素の dwHow メンバを確認して、コントロールが正常にマップされたかどうかを調べる必要がある。正常だった場合、ユーザーによる構成やデバイス メーカーによる構成など、オブジェクトの選択に使われた条件を確認することもできる。
3. アクション マップへの変更
この時点で、デフォルト マッピングを変更できる。ただし、変更は推奨しない。DIACTION 構造体の dwSemantic メンバを検証し、どのデバイス オブジェクトがアクションにマップされたかを確認したら、マップの値を変更できる。たとえば、DIJOFS_BUTTON9 にマップされているアクションを、トリガ ボタンにマップし直したい場合、アクション マップを適用する前に、この値を DIJOFS_BUTTON0 に変更する。
4. アクション マップの適用
DIACTIONFORMAT 構造体に含まれるデバイスのマッピングが適切であることを確認したら、IDirectInputDevice8::SetActionMap を呼び出す。それぞれの DIACTION 構造体の uAppData メンバに割り当てた値は、この時点で、dwSemantic メンバに指定されたコントロールにバインドされる。これは、次に特定のデバイス オブジェクトにバインドされる。
5. 複数デバイスのマッピング
ステップ 1 ~ 4 までを、アプリケーションで使う各デバイスに対して実行する。アクションをジョイスティックとキーボードの両方にマップすると仮定する。レーシング ゲームの例で、ゲームに eB_DRIVERVIEW として定義されたアクションは、DIACTION 配列の次の要素でキーボードのキーにマップされた。
{eB_DRIVERVIEW, DIKEYBOARD_1, "Driver View", },
この例では、キーボード以外のデバイスに対して BuildActionMap が呼び出されると、その要素の DIACTION 構造体の dwHow メンバが DIAH_UNMAPPED に設定される。各デバイスが順に列挙されるのに従い、DIAH_UNMAPPED 以外の値が返されるまで、dwHow メンバの検証を続ける。これは、現在マップされている対象のデバイスがキーボードであり、アクションが要求されたキーに正常にマップされたことを示す。
正常にマップされたアクションも、別のデバイスにマップできる。この例では、eB_UPSHIFT が次のように 2 つの DIACTION 構造体に設定される。
{eB_UPSHIFT, DIBUTTON_DRIVINGR_SHIFTUP, 0, "Upshift", },
...
{eB_UPSHIFT, DIKEYBOARD_PRIOR, 0, "Upshift", },
デバイスが列挙されるのに従い、eB_UPSHIFT アクションは 1 つ以上のジョイスティックやその他のゲーム コントローラの適切なボタンにマップされ、次にキーボードのキーに再びマップされる。
6. 構成の表示
ユーザーにデバイスへのアクションのマップ状況を示すには、DICD_DEFAULT フラグを IDirectInput8::ConfigureDevices に渡す。次の図に示すように、デバイスのマッピング図を含むプロパティ シートが、表示専用モードで表示される。イメージを表示するメカニズムの詳細については、「アクション マップの使い方」のチュートリアルを参照すること。
デバイス メーカーからデバイス イメージが提供されていない場合、マッピングは次の図のようにテキスト モードで表示される。
注 Microsoft Windows® キーは、アプリケーションの協調レベルで排他協調レベルを通して受動的に無効にする場合や、DISCL_NOWINKEY フラグを使って能動的に無効にする場合でも、デフォルトのアクション マップ ユーザー インターフェイス (UI) が表示されている間はアクティブになる。
このプロパティ シートの詳細については、「デバイスのユーザー構成」を参照すること。