DirectInput DirectInput C/C++ 튜토리얼 튜토리얼 5 :액션 맵의 사용법 스텝 2 :액션 맵의 정의 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
다음에, 각 게임 액션을, 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] = { // 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", }, };
다음에,DIACTIONFORMAT 구조체가 초기화되어 전에 정의한 DIACTION 배열 g_rgGameAction 가 저장 된다. 또,DIACTIONFORMAT 구조체는, 장르, 버퍼 사이즈, 축스케일링, 및 액션 맵의 알기 쉬운 이름을 정의한다. g_AppGuid 값은 애플리케이션으로 정의된 글로벌 일의 식별자 (GUID)이며, 액션 맵을 식별한다. GUID 의 생성 방법에 대해서는, 「COM 개체란」을 참조할것.
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 :장치에의 액션의 맵핑」으로 최적으로 일치하는 것이 검색된다.