-
Notifications
You must be signed in to change notification settings - Fork 1
02_08.UsingBitmapFonts
컴퓨터의 글꼴은 표현 방식에 따라 비트맵 글꼴 (bitmap font)과 벡터 글꼴 (vector font)로 나눌 수 있다. 비트맵 글꼴은 모니터가 표현할 수 있는 가장 작은 점 또는 디지털 화면을 구성하는 기본 단위인 픽셀 (pixel)로 글자를 표현하는 방식이고, 벡터 글꼴은 여러 개의 곡선 (Bézier curves)을 이용하여 글자를 표현하는 방식이다. 비트맵 글꼴은 처리 속도가 매우 빠르고, 프로그래밍할 때 쉽게 사용할 수 있다는 장점이 있지만, 다양한 크기의 글꼴을 표현하기 위해서는 크기에 맞는 이미지 파일이 필요하다는 단점이 존재한다. 벡터 글꼴은 비트맵 글꼴과 다르게 픽셀이 아닌 곡선으로 이루어져 있기 때문에 크기 등을 자유롭게 조정할 수 있다는 장점이 있지만, 처리 속도가 비트맵 글꼴에 비해 상대적으로 느리다는 단점이 존재한다.
raylib에서는 비트맵 글꼴 (.fnt
)과 벡터 글꼴 (.ttf
, .otf
)을 모두 지원하는데, 우리는 게임을 만들 때 벡터 글꼴이 아닌 비트맵 글꼴을 사용할 것이다. 그 이유는 벡터 글꼴을 사용하여 한글을 표현하기 위해서는 벡터 글꼴에서 매우 많은 글자 데이터를 불러와야 하고, 이로 인해 게임의 로딩 시간이 길어질 수 있기 때문이다. 혹시 비트맵 글꼴을 직접 만들어보고 싶다면, 여기를 참고하자.
raylib에서 한글 문자열을 출력하려면 먼저 유니코드 (Unicode)가 무엇인지 알아야 한다. 유니코드는 한글을 포함한 전 세계의 모든 문자를 컴퓨터에서 표현하기 위해 유니코드 협회 (Unicode Consortium)에서 설계한 산업 표준이다. 이러한 문자들을 컴퓨터에 저장하기 위한 방법을 인코딩 (encoding) 또는 문자 인코딩 (text encoding)이라고 하는데, raylib에서는 UTF-8이라는 인코딩 방식으로 저장된 한글 문자열만을 처리할 수 있다. 따라서 우리가 게임에서 한글 문자열을 출력하려면, 반드시 문자열을 UTF-8로 인코딩해서 상수 또는 매크로에 저장해야 한다. 여기서 한글 문자열을 입력하면, UTF-8로 인코딩된 문자열을 C언어에서 바로 사용할 수 있는 형태로 제공해주니 자주 사용하도록 하자.
이제 raylib의 text
모듈 (rtext.c
)에 정의된 비트맵 글꼴 관련 함수를 살펴보자.
// 주어진 경로에 위치한 글꼴 파일을 불러오고, 글꼴 데이터를 그래픽 카드 메모리에 저장한다.
RLAPI Font LoadFont(const char *fileName);
// 글꼴 데이터에 할당된 그래픽 카드 메모리를 해제한다.
RLAPI void UnloadFont(Font font);
raylib에서는 아래와 같이 게임 화면에 문자열을 그리는 함수를 제공한다.
// 2차원 위치 (`posX`, `posY`)에 FPS 카운터를 그린다.
RLAPI void DrawFPS(int posX, int posY);
// raylib의 기본 글꼴을 사용하여, 2차원 위치 (`posX`, `posY`)에 글꼴 크기가 `fontSize`이고
// 색상이 `color`인 문자열 `text`를 그린다.
RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color color);
// 주어진 글꼴을 사용하여, 2차원 위치 `position`에 글꼴 크기가 `fontSize`이고 간격이 `spacing`이며,
// 색상이 `color`인 문자열 `text`를 그린다.
RLAPI void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint);
이제 게임 화면에 한글 문자열을 직접 그려보자.
#include "raylib.h"
#define TARGET_FPS 60
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
int main(void) {
// "안녕하세요!"를 UTF-8로 인코딩한 문자열을 나타낸다.
const char *text = "\xEC\x95\x88\xEB\x85\x95\xED\x95\x98\xEC\x84\xB8\xEC\x9A\x94\x21";
InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "6pm-crew/play");
SetTargetFPS(TARGET_FPS);
// 한글 비트맵 글꼴을 그래픽 카드 메모리로 불러온다.
Font font = LoadFont("res/fonts/neodgm-32pt.fnt");
while (!WindowShouldClose()) {
BeginDrawing();
ClearBackground(BLACK);
// 게임 화면에 FPS 카운터를 그린다.
DrawFPS(8, 8);
// 한글 문자열을 게임 화면에 그렸을 때의 가로 및 세로 길이를 계산한다.
Vector2 dimensions = MeasureTextEx(font, text, font.baseSize, 2.0f);
// 한글 비트맵 글꼴을 사용하여, 게임 화면에 한글 문자열을 그린다.
DrawTextEx(
font,
text,
(Vector2) {
0.5f * (SCREEN_WIDTH - dimensions.x),
0.5f * (SCREEN_HEIGHT - dimensions.y)
},
font.baseSize,
2.0f,
WHITE
);
EndDrawing();
}
// 글꼴에 할당된 그래픽 카드 메모리를 해제한다.
UnloadFont(font);
CloseWindow();
return 0;
}
프로그램을 실행하면 아래와 같이 게임 화면의 가운데에 한글 문자열이 그려지는 것을 확인할 수 있다.
- 오픈 소스 소프트웨어란?
- Git과 버전 관리 시스템
- GitHub를 이용한 저장소 호스팅
- 프로젝트의 기여 및 관리
- 라이브러리 소개
- 개발 환경 구축
- 첫 번째 프로그램
- 게임 창과 커서 관리
- 프레임, 시간과 타이머
- 픽셀, 선분과 기본 도형
- 마우스와 키보드 입력
- 벡터 글꼴과 비트맵 글꼴
- 이미지와 텍스처의 사용
- 카메라와 렌더 텍스처
- 충돌 감지와 충돌 해결
- 효과음과 음악 재생
- 그 외 유용한 함수