アクション マップの準備
アクション マップの準備
アクション マップとは、アプリケーションのアクションと、仮想コントロールやデバイス オブジェクトへのマッピングに関する情報を格納している DIACTIONFORMAT 構造体のことである。この構造体がアプリケーションと Microsoft® DirectInput® の間でやり取りされ、最終的なマッピングが確立される。ここでは、マップの初期化方法について説明する。
1. アプリケーション アクションの定義
DirectInput アクション マップを実装する際の最初の手順は、アプリケーション内のどの入力ドリブン アクションをデバイス オブジェクトにマップする必要があるかを決定することである。軸やボタンによって実行できるアクションの場合、軸とボタンの両方の入力タイプに独立したアクションを定義しなければならない。デバイスが適切な軸を持たない場合に備えて、重要な機能にはすべてボタン アクションを定義することを推奨する。
次のアクション値の列挙例は、カーレーシング ゲームで定義されるものを想定している。軸アクションは "eA" で始まり、ボタン アクションは "eB" で始まる。
enum eGameActions
{
eA_STEER, // Steering
eB_STEER_LEFT, // Steer left
eB_STEER_RIGHT, // Steer right
eA_ACCELERATE, // Change speed
eB_ACCELERATE, // Speed up
eB_DECELERATE, // Slow down
eA_BRAKE, // Brake
eB_BRAKE, // Brake
eB_UPSHIFT, // Shift to higher gear
eB_DOWNSHIFT, // Shift to lower gear
eB_CYCLEVIEW, // Cycle to next view
eB_COURSEVIEW, // Toggle course view
eB_DRIVERVIEW, // View from driver's seat
eB_BRAKEBIAS, // Brake bias
eA_VOLUME, // Sound volume
eB_MUTE // Toggle sound
};
#define NUM_MY_ACTIONS 16
この例では、アクションは列挙値として定義されている。ただし、関数へのポインタなど、他の 32 ビット データ型をとることもできる。デバイス データを取得する場合、定義したアクション値はすべて取得されるので、その値を自由に処理できる。
2. ジャンルの定義
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 のコントロールは、ほとんどの場合、デバイス メーカーがデフォルト マッピングとしてサポートするコントロールである。ただし、デバイスがすべての仮想コントロールをサポートするという保証はない。
3. コントロールやデバイス オブジェクトへのアクションの割り当て
アクション マップ作成の次の手順では、それぞれのアプリケーション アクションに、該当ジャンルで定義された 1 つ以上の仮想コントロールを関連付ける。この処理を行うには、DIACTION 構造体の配列を宣言して初期化する。配列内の構造体はそれぞれ、アクション値、それに関連付けられた仮想コントロール、およびそのアクションを説明する登録名を指定する。その他のメンバはゼロとして残す。これらのメンバの値は後で DirectInput が指定する。
DIACTION 配列の要素を使って、キーボードの特定のキー、マウスの特定のボタン、または Microsoft DirectPlay® 音声デバイスのチャンネルにアクションをマップすることもできる。そうすることで、仮想コントロールからの入力に限らずすべての入力で、簡略化された入力ループを利用できる。たとえば、アプリケーション定義アクション eB_UPSHIFT を DIBUTTON_DRIVINGR_SHIFTUP 仮想コントロールと、Page Up キーの両方にマップする仮定する。データを取得する場合、入力元がジョイスティック ボタンとキーボードのどちらであるかにかかわらず、eB_UPSHIFT を取得する。
以下の例は、カーレーシング ゲーム用のアクション マップを宣言している。
DIACTION rgActions[]=
{
//Genre-defined virtual axes
{eA_STEER, DIAXIS_DRIVINGR_STEER, 0, "Steer", },
{eA_ACCELERATE, DIAXIS_DRIVINGR_ACCELERATE, 0, "Accelerate", },
{eA_BRAKE, DIAXIS_DRIVINGR_BRAKE, 0, "Brake", },
//Genre-defined virtual buttons
{eB_UPSHIFT, DIBUTTON_DRIVINGR_SHIFTUP, 0, "Upshift", },
{eB_DOWNSHIFT, DIBUTTON_DRIVINGR_SHIFTDOWN, 0, "DownShift", },
{eB_CYCLEVIEW, DIBUTTON_DRIVINGR_VIEW, 0, "Change View",},
// Actions not defined in the genre that can be assigned to any
// button or axis
{eA_VOLUME, DIAXIS_ANY_1, 0, "Volume", },
{eB_MUTE, DIBUTTON_ANY(0), 0, "Toggle Sound",},
// Actions not defined in the genre that must be assigned to
// particular keys
{eB_DRIVERVIEW, DIKEYBOARD_1, 0, "Driver View",},
{eB_COURSEVIEW, DIKEYBOARD_C, 0, "Course View",},
{eB_BRAKEBIAS, DIKEYBOARD_B, 0, "Brake Bias", },
// Actions mapped to keys as well as to virtual controls
{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", },
// Actions mapped to buttons as well as to virtual controls and keys
{eB_UPSHIFT, DIMOUSE_BUTTON0, 0, "Upshift", },
{eB_DOWNSHIFT, DIMOUSE_BUTTON1, 0, "Downshift", },
};
この例で、一部のアクションは、キーボード マッピングを使って実際のキーにマップされている。同様に、マウスのボタンと軸へのマッピングも、マウス マッピングを使って実行できる。
DIACTION 配列は、ジャンル、アプリケーション、および軸データの適切なスケーリングに関する情報を格納する DIACTIONFORMAT 構造体の一部である。アクション マップ プロセスの全体にわたり、この構造体の同じインスタンスを使う。一部のメンバはすぐには使われないが、次の手順「一致するデバイスの検索」に進む前に、構造体全体に値を設定できる。