문서의 이전 판입니다!
이번에는 게임패드 입력을 해볼 것이다.
스타팅 프로젝트
- 상속을 이용하여 다른 아이템 만들기가 이전 프로젝트이다.
- 상속을 이용하여 다른 아이템 만들기프로젝트 파일을 다운 받아서 시작하자
게임 클래스 수정해 보기
1. 기본 개념
게임패드는 여러개가 있을 수 있다. 통상 게임기들은 게임패드를 4개까지 지원한다. raylib역시 4개 까지의 게임패드를 지원한다.
bool IsGamepadAvailable(int gamepad); // Check if a gamepad is available
함수는 몇번째 게임패드가 지금 입력가능한지를 인자로 받아서 리턴해주는 함수이다. 우리는 1인용 게임을 만들므로 제일 첫번쨰, 즉, 0번째 게임패드를 쓸 것이다.
따라서 game.h에는 gamepad라는 멤버 변수를 0으로 정의해 주면 된다.
int gamepad = 0; // 제일 처음에 꽂은 게임패드만 사용하도록 하자. 제일 처음이므로 0이다.
2. 게임패드의 버튼
raylib에서 게임패드의 버튼을 enum화 한 것은 Raylib 게임패드 매핑에서 볼 수 있다.
이를 살펴보면, 게임패드 A키는 GAMEPAD_BUTTON_RIGHT_FACE_DOWN이고,
가운데에 있는 select키는 GAMEPAD_BUTTON_MIDDLE_LEFT인 것을 확인할 수 있다. 이를통해 키보드 입력과 동일하게 입력을 받으면 된다.
3. 게임패드 입력 로직
키보드의 IsKeyPressed()에 대응하는 키패드 입력 함수는 IsGamepadButtonPressed()이다1).
다만 키보드는 딱 한개만 상정하므로 바로 키 버튼을 인자로 받는데 반하여 키패드는 여러개가 있을 수 있으므로 어떤 게임패드를 받을 수 있을지를 인자로 받는다.
즉,
IsGamepadButtonPressed(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_DOWN)
와 같이 2개를 인자로 받는 것이다. 이 점만 생각하면 별 어려움이 없다. 게임패드는 수시로 연결이 끊길 수 있으므로 게임패드가 연결되었는지를 확인하고, 연결되지 않았으면 키보드 입력을 받게 로직을 짜보자.
Update()메서드에서 다음과 같이 짜면 된다.
case Gamestate::game : // 게임로직 // GamePad Logic if (IsGamepadAvailable(gamepad)) { if (IsGamepadButtonPressed(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_DOWN)) bird.Jump(); if (IsGamepadButtonPressed(gamepad, GAMEPAD_BUTTON_MIDDLE_LEFT)) { gamestate = Gamestate::pause; // 게임정지로 바꾸기 PauseMusicStream(music); } }else { if (IsKeyPressed(KEY_UP)) bird.Jump(); // 새 점프 // 키보드 입력 if (IsKeyPressed(KEY_ESCAPE)) { gamestate = Gamestate::pause; // 게임정지로 바꾸기 PauseMusicStream(music); } }
4. Draw()메서드
게임패드가 있을 와 없을 때에 따라 화면이 달라지게 로직을 짜자, 게임패드가 있을 때에는 현재 어떤 종류의 게임패드를 가지고 있는지를 화면에 출력하게 하는 것이다.
case Gamestate::game: // 게임화면 그리기 DrawBackground(); // 배경그리기 // 게임 UI if (IsGamepadAvailable(gamepad)) { DrawText("Pause : Press ESC", GetScreenWidth() - 200, 20, 20, DARKGRAY); DrawText(TextFormat("Pipes : %d", pipes.size()), GetScreenWidth() - 200, 40, 20, DARKGRAY); DrawText(TextFormat("Score : %d", bird.Score), GetScreenWidth() - 200, 60, 20, DARKGRAY); DrawText(TextFormat("Lifes : %d", bird.Life), GetScreenWidth() - 200, 80, 20, DARKGRAY); DrawText(TextFormat("GP%d: %s", gamepad, GetGamepadName(gamepad)), GetScreenWidth() - 200, 100, 20, BLACK); DrawCircle(GetScreenWidth() - 200 + (int)(GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_LEFT_X)*20), 152 + (int)(GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_LEFT_Y)*20), 25, DARKPURPLE); }else { DrawText("Pause : Select button", GetScreenWidth() - 200, 20, 20, DARKGRAY); DrawText(TextFormat("Pipes : %d", pipes.size()), GetScreenWidth() - 200, 40, 20, DARKGRAY); DrawText(TextFormat("Score : %d", bird.Score), GetScreenWidth() - 200, 60, 20, DARKGRAY); DrawText(TextFormat("Lifes : %d", bird.Life), GetScreenWidth() - 200, 80, 20, DARKGRAY); }; break;
지금까지는 딱히 어려움은 없어 보인다.
로그인