?/TD> |
Microsoft DirectX 9.0 |
Next, each game action should be assigned to at least one virtual control or device object. These controls are defined as action-mapping constants and are defined by genre and subgenre. In this case, the best choice is the Space Combat subgenre of the flight-games genre. This subgenre makes the following constants available.
Priority 1 Controls |
---|
DIAXIS_SPACESIM_LATERAL DIAXIS_SPACESIM_MOVE DIAXIS_SPACESIM_THROTTLE DIBUTTON_SPACESIM_FIRE DIBUTTON_SPACESIM_MENU DIBUTTON_SPACESIM_TARGET DIBUTTON_SPACESIM_WEAPONS |
Priority 2 Controls |
---|
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 |
Priority 1 controls are those controls that, at the minimum, should be mapped to a device object if possible. Priority 2 controls are less critical to basic game operation and may be mapped as needed.
Game actions are assigned to action-mapping constant controls in an array of DIACTION structures. Each DIACTION structure contains at least one game action, its associated action-mapping constant, any necessary flags, and either a friendly name or identifier (ID) string for the action. The remaining DIACTION members are not used at this point. The following code sample shows definition of the array of DIACTION structures.
#define NUMBER_OF_ACTIONS 18 DIACTION g_rgGameAction[NUMBER_OF_ACTIONS] = { // Device input pre-defined by DirectInput, according to genre {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",}, // Keyboard input mappings {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", }, // Mouse input mappings {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", }, };
A DIACTIONFORMAT structure is then initialized to contain the DIACTION array g_rgGameAction defined above. The DIACTIONFORMAT structure also defines the genre, buffer size, axis scaling, and a friendly name for the action map. The g_AppGuid value is a globally unique identifier (GUID) defined in the application to identify the action map. For more information about creating GUIDs, see GUIDs.
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";
This DIACTIONFORMAT structure is matched against enumerated devices to find the best match in Step 3: Mapping Actions to Devices.