HOWTO · Pygame

Cómo mostrar texto en Pygame

Aprende a crear una fuente, renderizar texto en una superficie y dibujarlo en el bucle de juego de Pygame con un ejemplo completo en Python.

En esta página

Para mostrar texto en Pygame, crea una fuente, renderiza una cadena en una superficie y dibuja esa superficie en la pantalla con blit(). Si la etiqueta es estática, renderízala antes del bucle de juego; en cada fotograma, limpia la pantalla, dibuja el texto, procesa los eventos y actualiza la pantalla. El ejemplo completo de abajo crea su propia ventana, así que puedes adaptarlo directamente o integrar los pasos de renderizado en un juego existente.

Crear una fuente en Pygame

Pygame ofrece dos formas habituales de crear un objeto de fuente. pygame.font.Font carga un archivo de fuente desde una ruta o usa la fuente predeterminada integrada en Pygame si el primer argumento es None. La ruta personalizada debe apuntar a un archivo de fuente al que pueda acceder el programa. pygame.font.SysFont busca por nombre una fuente instalada en el sistema, una opción práctica si no quieres incluir un archivo de fuente en tu proyecto. Ambos constructores reciben el tamaño en puntos: pygame.font.Font(None, 36) usa la fuente predeterminada a 36 puntos, mientras que pygame.font.SysFont("arial", 36) solicita Arial si está instalada. Elige uno de los constructores y conserva el objeto de fuente que devuelve. El ejemplo completo usa la fuente predeterminada, por lo que no necesita ningún recurso adicional.

Renderizar texto y dibujarlo en el bucle del juego

Llama a render() sobre el objeto de fuente y pásale la cadena, un valor booleano para el antialiasing y un color; por ejemplo: font.render("Score: 10", True, (255, 255, 255)). Al establecer el antialiasing en True, los bordes de las letras se ven más suaves. El color es una tupla RGB cuyos canales van de 0 a 255. render() crea una superficie; no coloca el texto en la ventana. Llama a screen.blit(text_surface, (x, y)) para dibujarla con la esquina superior izquierda en las coordenadas (x, y) y, después, actualiza la pantalla.

Si el texto no cambia, crea la superficie renderizada antes del bucle para que Pygame no renderice la misma cadena en cada fotograma. Si el valor cambia, renderiza una superficie nueva cuando se produzca el cambio y sigue dibujándola en cada fotograma. Para centrar el texto, usa el rectángulo de la superficie renderizada y sitúa su centro en el centro de la pantalla. Así mantienes separado el proceso de crear el texto del de dibujarlo, y el bucle de juego puede volver a dibujar la misma superficie de forma eficiente.

Ejecutar un ejemplo completo para mostrar texto

Este ejemplo completo inicializa Pygame, crea una ventana de 640 por 360, renderiza una felicitación centrada una sola vez y luego la dibuja sobre un fondo oscuro mientras procesa eventos y actualiza la pantalla. La vista previa se cierra al salir de la ventana o después de cinco segundos; en un juego, elimina el temporizador de vista previa y mantén el bucle activo hasta que el jugador salga. El texto estático se renderiza una vez antes del bucle.

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.