Microsoft DirectX 8.0 (C++) |
アクション マップとは、アプリケーションのアクションと、仮想コントロールやデバイス オブジェクトへのマッピングに関する情報を格納している DIACTIONFORMAT 構造体である。この構造体がアプリケーションと Microsoft® DirectInput® の間でやりとりされ、最終的なマッピングが確立される。ここでは、マップの初期化方法について説明する。
DirectInput アクション マッピングを実装する際の第 1 ステップは、アプリケーション内のどの入力ドリブン アクションをデバイス オブジェクトにマップする必要があるかを決定することである。軸やボタンによって実行できるアクションの場合、軸とボタンの両方の入力タイプに独立したアクションを定義しなければならない。デバイスが適切な軸を持たない場合に備えて、重要な機能にはすべてボタン アクションを定義することが推奨される。
次のアクション値の列挙例は、カーレーシング ゲームにより定義されるものとする。軸アクションは "eA" で始まり、ボタン アクションは "eB" で始まる。
enum eGameActions { eA_STEER, // ハンドル eB_STEER_LEFT, // ハンドルを左に切る eB_STEER_RIGHT, // ハンドルを右に切る eA_ACCELERATE, // 速度変更 eB_ACCELERATE, // 加速 eB_DECELERATE, // 減速 eA_BRAKE, // ブレーキ eB_BRAKE, // ブレーキ eB_UPSHIFT, // 高速ギアにシフト eB_DOWNSHIFT, // 低速ギアにシフト eB_CYCLEVIEW, // 次のビューに転換 eB_COURSEVIEW, // コース ビューの切り替え eB_DRIVERVIEW, // 運転席ビュー eB_BRAKEBIAS, // ブレーキ バイアス eA_VOLUME, // 音量 eB_MUTE // サウンドの切り替え }; #define NUM_MY_ACTIONS 16
この例では、アクションは列挙値として定義されている。ただし、関数へのポインタなど、ほかの 32 ビット データ型をとることもできる。デバイス データを取得する場合、定義したアクション値はすべて取得されるので、その値を自由に処理できる。
第 2 ステップは、アプリケーションの属するジャンルを決定することである。ジャンルにより、仮想コントロールのセットが定義される。適切なジャンルを選択することで、アプリケーション アクションに対して最適な仮想コントロールを取得できる。メーカーがデバイスにデフォルト マッピングを設定する場合、メーカーは DirectInput で定義されたジャンルのうち 1 つ以上をサポートしなければならない。ジャンル一覧については、「アクション マッピング定数」を参照すること。
この例のゲームの場合は、当然 DIVIRTUAL_DRIVING_RACE ジャンルを選択する。このジャンルには以下の仮想コントロールが含まれている。
優先順位 1 のコントロール
DIAXIS_DRIVINGR_STEER
DIAXIS_DRIVINGR_ACCELERATE
DIAXIS_DRIVINGR_BRAKE
DIBUTTON_DRIVINGR_SHIFTUP
DIBUTTON_DRIVINGR_SHIFTDOWN
DIBUTTON_DRIVINGR_VIEW
DIBUTTON_DRIVINGR_MENU
優先順位 2 のコントロール
DIAXIS_DRIVINGR_ACCEL_AND_BRAKE
DIHATSWITCH_DRIVINGR_GLANCE
DIBUTTON_DRIVINGR_ACCELERATE_LINK
DIBUTTON_DRIVINGR_AIDS
DIBUTTON_DRIVINGR_BOOST
DIBUTTON_DRIVINGR_BRAKE
DIBUTTON_DRIVINGR_DASHBOARD
DIBUTTON_DRIVINGR_DEVICE
DIBUTTON_DRIVINGR_GLANCE_LEFT_LINK
DIBUTTON_DRIVINGR_GLANCE_RIGHT_LINK
DIBUTTON_DRIVINGR_MAP
DIBUTTON_DRIVINGR_PAUSE
DIBUTTON_DRIVINGR_PIT
DIBUTTON_DRIVINGR_STEER_LEFT_LINK
DIBUTTON_DRIVINGR_STEER_RIGHT_LINK
優先順位 1 のコントロールと 優先順位 2 コントロールの間に機能上の差異はない。優先順位 1 のコントロールは、デバイス メーカーがデフォルト マッピングとしてサポートすることが望ましいコントロールである。ただし、どの仮想コントロールも、デバイスによりサポートされる保証はない。
アクション マップ作成の次のステップでは、それぞれのアプリケーション アクションに、該当ジャンルで定義された 1 つ以上の仮想コントロールを関連付ける。この処理を行うには、DIACTION 構造体の配列を宣言して初期化する。配列内の構造体はそれぞれ、アクション値、それに関連付けられた仮想コントロール、およびそのアクションを説明する登録名を指定する。その他のメンバはゼロとして残す。これらのメンバの値は後で DirectInput により指定される。
DIACTION 配列の要素を使って、アクションをキーボードの特定のキー、またはマウスの特定のボタン、あるいは Microsoft DirectPlay® 音声デバイスにマップすることもできる。そうすることで、仮想コントロールからの入力に限らずすべての入力で、簡略化された入力ループを利用できる。たとえば、アプリケーション定義アクション eB_UPSHIFT を DIBUTTON_DRIVINGR_SHIFTUP 仮想コントロールと、Page Up キーの両方にマップするとしよう。データを取得する場合、入力源がジョイスティック ボタンとキーボードのどちらであるかにかかわらず、eB_UPSHIFT を取得する。
以下の例は、カーレーシング ゲーム用のアクション マップを宣言している。
DIACTION rgActions[]= { // ジャンル定義の仮想軸。 {eA_STEER, DIAXIS_DRIVINGR_STEER, 0, "Steer", }, {eA_ACCELERATE, DIAXIS_DRIVINGR_ACCELERATE, 0, "Accelerate", }, {eA_BRAKE, DIAXIS_DRIVINGR_BRAKE, 0, "Brake", }, // ジャンル定義の仮想ボタン。 {eB_UPSHIFT, DIBUTTON_DRIVINGR_SHIFTUP, 0, "Upshift", }, {eB_DOWNSHIFT, DIBUTTON_DRIVINGR_SHIFTDOWN, 0, "DownShift", }, {eB_CYCLEVIEW, DIBUTTON_DRIVINGR_VIEW, 0, "Change View",}, // 任意のボタンや軸に割り当て可能な // ジャンル未定義のアクション。 {eA_VOLUME, DIAXIS_ANY_1, 0, "Volume", }, {eB_MUTE, DIBUTTON_ANY(0), 0, "Toggle Sound",}, // 特定のキーに割り当てる必要がある // ジャンル未定義のアクション。 {eB_DRIVERVIEW, DIKEYBOARD_1, 0, "Driver View",}, {eB_COURSEVIEW, DIKEYBOARD_C, 0, "Course View",}, {eB_BRAKEBIAS, DIKEYBOARD_B, 0, "Brake Bias", }, // キーと仮想コントロールにマップされたアクション。 {eB_UPSHIFT, DIKEYBOARD_PRIOR, 0, "Upshift", }, {eB_DOWNSHIFT, DIKEYBOARD_NEXT, 0, "Downshift", }, {eB_STEER_LEFT, DIKEYBOARD_LEFT, 0, "Steer Left", }, {eB_STEER_RIGHT, DIKEYBOARD_RIGHT, 0, "Steer Right",}, {eB_ACCELERATE, DIKEYBOARD_UP, 0, "Accelerate", }, {eB_DECELERATE, DIKEYBOARD_DOWN, 0, "Decelerate", }, {eB_BRAKE, DIKEYBOARD_END, 0, "Brake", }, // ボタンと仮想コントロールおよびキーにマップされたアクション。 {eB_UPSHIFT, DIMOUSE_BUTTON0, 0, "Upshift", }, {eB_DOWNSHIFT, DIMOUSE_BUTTON1, 0, "Downshift", }, };
この例で、一部のアクションは、キーボード マッピング定数を使って実際のキーにマップされている。同様に、マウスのボタンと軸へのマッピングも、マウス マッピング定数を使って行うことができる。
DIACTION 配列は、ジャンル、アプリケーション、および軸データの適切なスケーリングに関する情報を格納する DIACTIONFORMAT 構造体の一部である。アクション マッピング プロセスの全体にわたり、この構造体の同じインスタンスを使用する。一部のメンバはすぐには使用されないが、次のステップ「一致するデバイスの検索」に移る前に、構造体全体に値を設定できる。