Skip to content

02_07.MouseAndKeyEvents

jdeokkim edited this page May 4, 2022 · 4 revisions

마우스와 키보드 입력

이번 글에서는 raylib의 core 모듈 (rcore.c)에 정의된 마우스와 키보드 입력 관련 함수들에 대해 알아보자. raylib.h 헤더 파일에서 "Input Handling Functions"를 검색하면 마우스, 키보드와 컨트롤러 입력과 관련된 나머지 함수들을 찾을 수 있다.


마우스 입력

// 마우스 버튼을 한 번 눌렀는지 확인한다.
RLAPI bool IsMouseButtonPressed(int button);

// 마우스 버튼을 계속 누르고 있는지 확인한다.
RLAPI bool IsMouseButtonDown(int button);

// 마우스 버튼을 한 번 눌렀다가 뗐는지 확인한다.
RLAPI bool IsMouseButtonReleased(int button);

// 마우스 버튼을 누르고 있지 않은지 확인한다.
RLAPI bool IsMouseButtonUp(int button);

마우스 입력 함수의 매개 변수 button은 마우스의 버튼을 나타내는 열거형 값으로, raylib.h에 아래와 같이 정의되어 있다.

// Mouse buttons
typedef enum {
    MOUSE_BUTTON_LEFT    = 0,  // Mouse button left
    MOUSE_BUTTON_RIGHT   = 1,  // Mouse button right
    MOUSE_BUTTON_MIDDLE  = 2,  // Mouse button middle (pressed wheel)
    MOUSE_BUTTON_SIDE    = 3,  // Mouse button side (advanced mouse device)
    MOUSE_BUTTON_EXTRA   = 4,  // Mouse button extra (advanced mouse device)
    MOUSE_BUTTON_FORWARD = 5,  // Mouse button forward (advanced mouse device)
    MOUSE_BUTTON_BACK    = 6,  // Mouse button back (advanced mouse device)
} MouseButton;

또한, 마우스의 현재 위치는 아래 함수를 통해 구할 수 있다. 여기서 GetMouseX(), GetMouseY()GetMousePosition()의 차이는 바로 GetMouseX()GetMouseY()int 값을 반환하지만, GetMousePosition()은 X 좌표와 Y 좌표의 값을 float으로 반환하기 때문에 마우스의 위치를 정밀하게 구할 수 있다는 것이다.

// 마우스 위치의 X 좌표를 반환한다.
RLAPI int GetMouseX(void);

// 마우스 위치의 Y 좌표를 반환한다.
RLAPI int GetMouseY(void);

// 마우스 위치를 반환한다.
RLAPI Vector2 GetMousePosition(void);

이제 마우스 입력 함수를 직접 사용해보자.

/* main.c */

#include "raylib.h"

#define TARGET_FPS     60

#define SCREEN_WIDTH   800
#define SCREEN_HEIGHT  600

#define CIRCLE_RADIUS  24

int main(void) {
    SetTargetFPS(TARGET_FPS);
    
    InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "6pm-crew/play");

    // 원의 중심점을 설정한다.
    Vector2 center = { 0.5f * SCREEN_WIDTH, 0.5f * SCREEN_HEIGHT };

    while (!WindowShouldClose()) {
        BeginDrawing();
        
        ClearBackground(BLACK);

        // 마우스 왼쪽 버튼을 계속 누르고 있는가?
        if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) {
            // 그렇다면 원의 중심점을 마우스의 현재 위치로 변경한다.
            center = GetMousePosition();
        }

        // 게임 화면에 원을 그린다.
        DrawCircleV(center, CIRCLE_RADIUS, WHITE);

        EndDrawing();
    }
    
    CloseWindow();

    return 0;
}

프로그램을 실행하면 아래와 같이 검은 창에 흰색 원이 하나 보일 것이다. 마우스 왼쪽 버튼을 클릭하면 원의 중심점이 마우스의 현재 위치가 되고, 마우스 왼쪽 버튼을 계속 누르고 있으면 원이 마우스를 따라가게 된다.

마우스 입력 함수 예제


키보드 입력

// 주어진 키를 한 번 눌렀는지 확인한다.
RLAPI bool IsKeyPressed(int key);

// 주어진 키를 계속 누르고 있는지 확인한다.
RLAPI bool IsKeyDown(int key);

// 주어진 키를 한 번 눌렀다가 뗐는지 확인한다.
RLAPI bool IsKeyReleased(int key);

// 주어진 키를 누르고 있지 않은지 확인한다.
RLAPI bool IsKeyUp(int key);

// 게임의 종료 키 (눌렀을 때 게임을 즉시 종료하는 키)를 설정한다. 기본값은 `ESC` 키이다.
RLAPI void SetExitKey(int key);

// 가장 최근에 누른 키를 반환한다. 동시에 여러 개의 키를 눌렀다면 
// 이 함수를 여러 번 호출해야 한다.
RLAPI int GetKeyPressed(void);

// 가장 최근에 누른 문자의 유니코드를 반환한다. 동시에 여러 개의 키를 눌렀다면 
// 이 함수를 여러 번 호출해야 한다.
RLAPI int GetCharPressed(void);

마우스 입력 함수와 마찬가지로, 키보드 입력 함수의 매개 변수 key는 키보드의 키를 나타내는 열거형 값이며, raylib.h에 아래와 같이 정의되어 있다.

typedef enum {
    KEY_NULL            = 0,    // Key: NULL, used for no key pressed
    // Alphanumeric keys
    KEY_APOSTROPHE      = 39,   // Key: '
    KEY_COMMA           = 44,   // Key: ,
    KEY_MINUS           = 45,   // Key: -
    /* ... */
    KEY_A               = 65,   // Key: A | a
    KEY_B               = 66,   // Key: B | b
    KEY_C               = 67,   // Key: C | c
    /* ... */
    KEY_SPACE           = 32,   // Key: Space
    KEY_ESCAPE          = 256,  // Key: Esc
    KEY_ENTER           = 257,  // Key: Enter
    KEY_TAB             = 258,  // Key: Tab
    KEY_BACKSPACE       = 259,  // Key: Backspace
    KEY_INSERT          = 260,  // Key: Ins
    KEY_DELETE          = 261,  // Key: Del
    KEY_RIGHT           = 262,  // Key: Cursor right
    KEY_LEFT            = 263,  // Key: Cursor left
    KEY_DOWN            = 264,  // Key: Cursor down
    KEY_UP              = 265,  // Key: Cursor up
    /* ... */
    KEY_BACK            = 4,    // Key: Android back button
    KEY_MENU            = 82,   // Key: Android menu button
    KEY_VOLUME_UP       = 24,   // Key: Android volume up button
    KEY_VOLUME_DOWN     = 25    // Key: Android volume down button
} KeyboardKey;

이제 키보드 입력 함수를 직접 사용해보자.

#include "raylib.h"

#define TARGET_FPS     60

#define SCREEN_WIDTH   800
#define SCREEN_HEIGHT  600

#define CIRCLE_RADIUS  24
#define CIRCLE_SPEED   6

int main(void) {
    SetTargetFPS(TARGET_FPS);
    
    InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "6pm-crew/play");

    // 원의 중심점을 설정한다.
    Vector2 center = { 0.5f * SCREEN_WIDTH, 0.5f * SCREEN_HEIGHT };

    while (!WindowShouldClose()) {
        BeginDrawing();
        
        ClearBackground(BLACK);

        /* 
            키보드 입력에 따라, 원의 중심점을 움직인다.

            `else if` 대신 그냥 `if`를 사용하는 이유는, 여러 키를
            동시에 누르는 것을 허용하기 위해서이다.
        */

        if (IsKeyDown(KEY_LEFT))  center.x -= CIRCLE_SPEED;
        if (IsKeyDown(KEY_RIGHT)) center.x += CIRCLE_SPEED;
        
        if (IsKeyDown(KEY_UP))    center.y -= CIRCLE_SPEED;
        if (IsKeyDown(KEY_DOWN))  center.y += CIRCLE_SPEED;

        // 게임 화면에 원을 그린다.
        DrawCircleV(center, CIRCLE_RADIUS, WHITE);

        EndDrawing();
    }
    
    CloseWindow();

    return 0;
}

키보드의 방향키를 누르면, 원이 키보드 입력에 따라 움직이는 것을 확인할 수 있다.

키보드 입력 함수 예제


Clone this wiki locally