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