-
Notifications
You must be signed in to change notification settings - Fork 1
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;
}
키보드의 방향키를 누르면, 원이 키보드 입력에 따라 움직이는 것을 확인할 수 있다.
- 오픈 소스 소프트웨어란?
- Git과 버전 관리 시스템
- GitHub를 이용한 저장소 호스팅
- 프로젝트의 기여 및 관리
- 라이브러리 소개
- 개발 환경 구축
- 첫 번째 프로그램
- 게임 창과 커서 관리
- 프레임, 시간과 타이머
- 픽셀, 선분과 기본 도형
- 마우스와 키보드 입력
- 벡터 글꼴과 비트맵 글꼴
- 이미지와 텍스처의 사용
- 카메라와 렌더 텍스처
- 충돌 감지와 충돌 해결
- 효과음과 음악 재생
- 그 외 유용한 함수