HOWTO · Pygame

Pygame에서 텍스트 표시하기

Pygame에서 글꼴을 만들고 텍스트를 surface로 렌더링한 뒤, 게임 루프에서 표시하는 방법과 완전한 Python 예제를 알아봅니다.

이 페이지의 내용

Pygame에서 텍스트를 표시하려면 글꼴 객체를 만들고 문자열을 surface로 렌더링한 다음, blit()으로 그 surface를 화면에 그리면 됩니다. 고정된 문구라면 게임 루프에 들어가기 전에 한 번 렌더링하세요. 각 프레임에서는 화면을 지우고 텍스트를 그린 뒤 이벤트를 처리하고 디스플레이를 갱신합니다. 아래 완전한 예제는 창까지 직접 만들므로 그대로 실행하거나 텍스트 렌더링 부분을 기존 게임에 옮겨 사용할 수 있습니다.

Pygame에서 글꼴 만들기

Pygame에서 글꼴 객체를 만드는 방법은 대표적으로 두 가지입니다. pygame.font.Font는 경로에 있는 글꼴 파일을 불러오며, 첫 번째 인수로 None을 지정하면 Pygame의 기본 글꼴을 사용합니다. 사용자 지정 경로를 쓸 때는 프로그램이 접근할 수 있는 글꼴 파일을 가리켜야 합니다. pygame.font.SysFont는 이름으로 시스템에 설치된 글꼴을 찾으므로 글꼴 파일을 프로젝트에 포함하지 않을 때 편리합니다. 두 생성자의 크기 인수는 포인트 단위입니다. pygame.font.Font(None, 36)은 기본 글꼴을 36포인트로 사용하고, pygame.font.SysFont("arial", 36)은 설치되어 있다면 Arial을 요청합니다. 두 생성자를 함께 호출할 필요는 없습니다. 하나를 선택해 반환된 글꼴 객체를 사용하면 됩니다. 아래 완전한 예제는 별도 파일이 필요 없는 기본 글꼴을 사용합니다.

텍스트를 렌더링하고 게임 루프에서 그리기

글꼴 객체의 render()에 문자열, 앤티앨리어싱 여부를 나타내는 불리언 값, 색상을 전달합니다. 예를 들어 font.render("Score: 10", True, (255, 255, 255))처럼 호출할 수 있습니다. 앤티앨리어싱을 True로 설정하면 글자 가장자리가 부드러워집니다. 색상은 각 채널 값이 0부터 255까지인 RGB 튜플입니다. render()는 텍스트 surface를 만들 뿐, 창에 바로 표시하지는 않습니다. screen.blit(text_surface, (x, y))를 호출하면 surface의 왼쪽 위 모서리가 (x, y)에 오도록 그릴 수 있습니다. 그다음 디스플레이를 갱신합니다.

바뀌지 않는 텍스트는 같은 문자열을 매 프레임 다시 렌더링하지 않도록 루프 밖에서 surface를 만드세요. 값이 바뀌는 경우에는 변경될 때 새 surface를 렌더링하고, 각 프레임에서는 그 surface를 계속 blit하면 됩니다. 텍스트를 가운데에 놓으려면 렌더링된 surface의 사각형을 가져와 중심을 화면 중심에 맞추세요. 이렇게 하면 텍스트 생성과 화면 그리기를 분리해 게임 루프에서 같은 surface를 효율적으로 다시 그릴 수 있습니다.

완전한 텍스트 표시 예제 실행하기

이 예제는 Pygame을 초기화하고 640×360 디스플레이를 만든 뒤, 가운데 정렬한 인사말을 한 번 렌더링합니다. 이후 어두운 배경에 텍스트를 그리면서 이벤트를 처리하고 디스플레이를 갱신합니다. 미리보기 창은 닫기 버튼을 누르거나 5초가 지나면 종료됩니다. 실제 게임에서는 미리보기 타이머를 제거하고 플레이어가 종료할 때까지 루프를 실행하세요. 고정 텍스트는 루프에 들어가기 전에 한 번 렌더링합니다.

import os
import warnings

os.environ.setdefault("PYGAME_HIDE_SUPPORT_PROMPT", "1")
os.environ.setdefault("SDL_AUDIODRIVER", "dummy")
runtime_dir = os.environ.get("XDG_RUNTIME_DIR")
wayland_ready = bool(
    os.environ.get("WAYLAND_DISPLAY")
    and runtime_dir
    and os.path.isdir(runtime_dir)
    and os.access(runtime_dir, os.R_OK | os.W_OK | os.X_OK)
)
if os.name != "nt" and not wayland_ready and (
    not os.environ.get("DISPLAY")
    or os.environ.get("WAYLAND_DISPLAY")
    or not runtime_dir
    or not os.path.isdir(runtime_dir)
    or not os.access(runtime_dir, os.R_OK | os.W_OK | os.X_OK)
):
    os.environ.setdefault("SDL_VIDEODRIVER", "dummy")
warnings.filterwarnings(
    "ignore",
    message="Your system is avx2 capable.*",
    category=RuntimeWarning,
)

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 360))
pygame.display.set_caption("Text in Pygame")
font = pygame.font.Font(None, 40)
text_surface = font.render("Hello, Pygame!", True, (255, 255, 255))
text_rect = text_surface.get_rect(center=screen.get_rect().center)
clock = pygame.time.Clock()
preview_done = pygame.USEREVENT
pygame.time.set_timer(preview_done, 5000)
running = True
while running:
    for event in pygame.event.get():
        if event.type in (pygame.QUIT, preview_done):
            running = False

    screen.fill((30, 30, 30))
    screen.blit(text_surface, text_rect)
    pygame.display.flip()
    clock.tick(60)
pygame.quit()
print("Text preview finished.")
Text preview finished.