Microsoft DirectX 8.0 (C++) |
次に、各ゲーム アクションを、1 つの仮想コントロールまたはデバイス オブジェクトに割り当てる。これらのコントロールはアクション マッピング定数として定義され、ジャンルおよびサブジャンルによって定義される。この例では、フライト ゲーム ジャンルの宇宙戦サブジャンルを選択するのが適切である。このサブジャンルでは、以下の定数を使用できる。
優先順位 1 のコントロール
DIAXIS_SPACESIM_LATERAL
DIAXIS_SPACESIM_MOVE
DIAXIS_SPACESIM_THROTTLE
DIBUTTON_SPACESIM_FIRE
DIBUTTON_SPACESIM_MENU
DIBUTTON_SPACESIM_TARGET
DIBUTTON_SPACESIM_WEAPONS
優先順位 2 のコントロール
DIAXIS_SPACESIM_CLIMB
DIAXIS_SPACESIM_ROTATE
DIBUTTON_SPACESIM_BACKWARD_LINK
DIBUTTON_SPACESIM_DEVICE DIBUTTON_SPACESIM_DISPLAY
DIBUTTON_SPACESIM_FASTER_LINK
DIBUTTON_SPACESIM_FIRESECONDARY
DIBUTTON_SPACESIM_FORWARD_LINK
DIBUTTON_SPACESIM_GEAR
DIBUTTON_SPACESIM_GLANCE_DOWN_LINK
DIBUTTON_SPACESIM_GLANCE_LEFT_LINK
DIBUTTON_SPACESIM_GLANCE_RIGHT_LINK
DIBUTTON_SPACESIM_GLANCE_UP_LINK
DIBUTTON_SPACESIM_LEFT_LINK DIBUTTON_SPACESIM_LOWER
DIBUTTON_SPACESIM_PAUSE DIBUTTON_SPACESIM_RAISE
DIBUTTON_SPACESIM_RIGHT_LINK
DIBUTTON_SPACESIM_SLOWER_LINK
DIBUTTON_SPACESIM_TURN_LEFT_LINK
DIBUTTON_SPACESIM_TURN_RIGHT_LINK
DIBUTTON_SPACESIM_VIEW
DIHATSWITCH_SPACESIM_GLANCE
優先順位 1 のコントロールは最低限必要なコントロールで、できるだけデバイス オブジェトにマッピングする必要がある。優先順位 2 のコントロールは、基本的なゲーム操作にはそれほど重要ではなく、必要に応じてマッピングできる。
ゲーム アクションは、DIACTION 構造体の配列にあるアクション マッピング定数コントロールに割り当てられる。各 DIACTION 構造体は、最低 1 つのゲーム アクションと、それに関連するアクション マッピング定数、必要なフラグ、そして、アクションのわかりやすい名前か ID 文字列を格納している。残りの DIACTION メンバは、この時点では使用しない。次のサンプル コードは、DIACTION 構造体の配列の定義を示している。
#define NUMBER_OF_ACTIONS 18 DIACTION g_rgGameAction[NUMBER_OF_ACTIONS] = { // デバイス入力は、ジャンルに応じて DInput で定義済み。 {INPUT_LEFTRIGHT_AXIS, DIAXIS_SPACESIM_LATERAL, 0, "Turn",}, {INPUT_UPDOWN_AXIS, DIAXIS_SPACESIM_MOVE, 0, "Move",}, {INPUT_FIREWEAPONS, DIBUTTON_SPACESIM_FIRE, 0, "Shoot",}, {INPUT_ENABLESHIELD, DIBUTTON_SPACESIM_GEAR, 0, "Shield",}, {INPUT_DISPLAYGAMEMENU, DIBUTTON_SPACESIM_DISPLAY, 0, "Display",}, {INPUT_QUITGAME, DIBUTTON_SPACESIM_MENU, 0, "Quit Game",}, // キーボード入力マッピング。 {INPUT_TURNLEFT, DIKEYBOARD_LEFT, 0, "Turn left", }, {INPUT_TURNRIGHT, DIKEYBOARD_RIGHT, 0, "Turn right", }, {INPUT_FORWARDTHRUST, DIKEYBOARD_UP, 0, "Forward thrust", }, {INPUT_REVERSETHRUST, DIKEYBOARD_DOWN, 0, "Reverse thrust", }, {INPUT_FIREWEAPONS, DIKEYBOARD_F, 0, "Fire weapons", }, {INPUT_ENABLESHIELD, DIKEYBOARD_S, 0, "Enable shields", }, {INPUT_DISPLAYGAMEMENU, DIKEYBOARD_D, DIA_APPFIXED, "Display game menu"), }, {INPUT_QUITGAME, DIKEYBOARD_ESCAPE, DIA_APPFIXED, "Quit game", }, // マウス入力マッピング。 {INPUT_LEFTRIGHT_AXIS, DIMOUSE_XAXIS, 0, "Turn", }, {INPUT_UPDOWN_AXIS, DIMOUSE_YAXIS, 0, "Move", }, {INPUT_FIREWEAPONS, DIMOUSE_BUTTON0, 0, "Fire weapons", }, {INPUT_ENABLESHIELD, DIMOUSE_BUTTON1, 0, "Enable shields", }, };
次に DIACTIONFORMAT 構造体が初期化され、前に定義したた DIACTION 配列 g_rgGameAction が格納される。また DIACTIONFORMAT 構造体は、ジャンル、バッファ サイズ、軸スケーリング、およびアクション マップのわかりやすい名前を定義する。g_AppGuid 値はアプリケーションで定義された GUID で、アクション マップを識別する。GUID の作成方法の詳細については、「GUID の使い方」を参照すること。
DIACTIONFORMAT diaf; diaf.dwSize = sizeof(DIACTIONFORMAT); diaf.dwActionSize = sizeof(DIACTION); diaf.dwDataSize = NUMBER_OF_ACTIONS * sizeof(DWORD); diaf.dwNumActions = NUMBER_OF_ACTIONS; diaf.guidActionMap = g_AppGuid; diaf.dwGenre = DIVIRTUAL_SPACESIM; diaf.rgoAction = g_rgGameAction; diaf.dwBufferSize = 16; diaf.lAxisMin = -100; diaf.lAxisMax = 100; diaf.tszActionMap = "DI Test";
この DIACTIONFORMAT 構造体が列挙されたデバイスと照合され、「ステップ 3 : デバイスへのアクションのマッピング」で最適の組み合わせが調べられる。