사용자 도구

사이트 도구


raylib:게임패드_입력
게임패드 입력

문서의 이전 판입니다!


이번에는 게임패드 입력을 해볼 것이다.

스타팅 프로젝트

게임 클래스 수정해 보기

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);
 
            }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;

지금까지는 딱히 어려움은 없어 보인다.

1)
버튼을 한번씩만 누르게 하기 위하여 pressed함수를 썼다. 만약에 누른 상태로 계속하여 입력을 받으려면 뒤에 접시마가 'Down'이 될 것이다
로그인하면 댓글을 남길 수 있습니다.

raylib/게임패드_입력.1698070568.txt.gz · 마지막으로 수정됨: 2023/10/23 23:16 (바깥 편집)