Diseño y grafismo en todos sus estados con Pygame
Introducción
En los capítulos anteriores hemos visto los conceptos básicos de Pygame y, en particular, la gestión del bucle del juego. Hay conceptos importantes, como la gestión de colisiones, que se han dejado de lado hasta ahora: de hecho, cuando queremos detectar el encuentro de un objeto con otro (como para el objeto que rebota), lo hemos hecho utilizando el cálculo geométrico. Pygame permite mucho más a este nivel y obviamente lo estudiaremos más adelante.
En este capítulo, detallaremos algo que ya hemos abordado ligeramente: los aspectos gráficos. De hecho, son fundamentales en el desarrollo de videojuegos. Por lo tanto, el objetivo de este capítulo es ir lo más lejos posible en el diseño usando Pygame. Por diseño, nos referimos aquí al trazado de formas geométricas: cuadrados, rectángulos, líneas, arcos de círculo, polígonos, elipses, etc.
De hecho, necesitaremos estas formas más o menos elementales para mejorar el aspecto visual de los juegos y, en algunas ocasiones, para definir elementos del juego en sí. Por ejemplo, las líneas pueden ser la representación gráfica de paredes en un laberinto, de dónde el jugador busca escapar.
También ampliaremos nuestra discusión a los gráficos en general en Pygame, centrándonos en la visualización de imágenes...
Dibujar formas con Pygame
1. El módulo pygame.draw
Este módulo de Pygame le permite dibujar las principales formas geométricas que pueda necesitar. Estas incluyen:
-
una línea, usando la función pygame.draw.line
-
una línea discontinua, usando la función pygame.draw.lines
-
un rectángulo, usando la función pygame.draw.rect
-
un polígono, usando la función pygame.draw.polygon
-
un círculo, usando la función pygame.draw.circle
-
una elipse, utilizando la función pygame.draw.ellipse
-
un arco de círculo o elipse, usando la función pygame.draw.arc
La documentación del módulo draw de Pygame está disponible en el capítulo Principales módulos de Pygame.
2. Dibujar una línea
Vamos a empezar por colorear el fondo de la ventana del juego de negro. Posteriormente, dibujaremos las dos diagonales del cuadrado de la ventana del juego. Ambas diagonales serán de color rojo. Geométricamente, son segmentos.
Como se ha visto antes, utilice la función pygame.draw.line. El código es el siguiente:
import pygame, sys
pygame.init()
# VENTANA DE 400 POR 400 CON FONDO NEGRO
PANTALLA = pygame.display.set_mode((400,400))
pygame.display.set_caption("Capítulo 5")
COLOR_NEGRO = pygame.Color(0, 0, 0)
PANTALLA.fill(COLOR_NEGRO)
# DIAGONALES EN ROJO
COLOR_ROJO = pygame.Color(255, 0, 0)
pygame.draw.line(PANTALLA, COLOR_ROJO, (0,0), (400, 400))
pygame.draw.line(PANTALLA, COLOR_ROJO, (0, 400), (400, 0))
# BUCLE DE JUEGO
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.flip()
Este es el código que muestra las dos diagonales:
pygame.draw.line(PANTALLA, COLOR_ROJO, (0,0), (400, 400))
pygame.draw.line(PANTALLA, COLOR_ROJO, (0, 400), (400, 0))
Los argumentos utilizados en la llamada de line son los siguientes:
1. La superficie sobre la que dibujar la línea (aquí, la propia ventana del juego).
2. El color de la línea.
3. El punto geométrico inicial del segmento definido en el sistema de coordenadas.
4. El punto geométrico final del segmento también definido en el sistema de coordenadas.
3. Dibujar una línea...
Ver y guardar imágenes con Pygame
1. El módulo pygame.image
El tema de cargar y mostrar imágenes se ha explicado en el capítulo Conceptos del videojuego y primeros pasos con Pygame con el ejemplo Cohete y planeta. Por lo tanto, se trata de aclarar un poco todo esto. De hecho, el desarrollo de un juego a menudo implica mostrar imágenes elementales. Por ejemplo, la imagen elemental de la pared de un laberinto, que se mostrará en múltiples copias.
Pygame ofrece un módulo llamado image dedicado a mostrar y guardar imágenes. Las funciones disponibles en este módulo son:
-
pygame.image.load: carga y muestra una imagen externa.
-
pygame.image.save: guarda una imagen de Pygame en un archivo.
-
pygame.image.get_extended: prueba antes de mostrar si la carga y la visualización son posibles con Pygame.
-
pygame.image.tostring: crea un búfer de cadena de caracteres que representa la imagen.
-
pygame.image.fromstring: crea una superficie de tipo imagen a partir de un búfer de cadena de caracteres.
-
pygame.image.frombuffer: crea una superficie de tipo imagen a partir de un búfer.
Un búfer en informática es una memoria RAM dinámica que se utiliza para almacenar información temporalmente.
La documentación del módulo image de Pygame está disponible en el capítulo Principales módulos de Pygame.
2. Cargar imágenes con Pygame
a. La función...
Usar y manipular texto en Pygame
1. El módulo pygame.font
La visualización de las cadenas de caracteres y, por lo tanto, de texto en Pygame, sigue la misma lógica que la utilizada para formas geométricas o imágenes: la de las superficies Pygame. Aquí, también se tratará de escribir texto sobre una superficie determinada.
El principal problema de la visualización del texto es el de la fuente de caracteres (font en inglés). El módulo dedicado de Pygame se llama pygame.font.
Las principales funciones de este módulo son las siguientes:
-
pygame.font.get_default_font: obtiene el nombre del archivo de la fuente de caracteres predeterminada.
-
pygame.font.get_fonts: obtiene todas las fuentes de caracteres disponibles.
-
pygame.font.match_font: busca una fuente de caracteres con un nombre determinado.
-
pygame.font.SysFont: crea un objeto nuevo "fuente de caracteres" basado en una de las fuentes de caracteres del sistema (es decir, instaladas en la máquina).
-
pygame.font.Font: crea un nuevo objeto "fuente de caracteres" basado en un archivo de fuente de caracteres.
La documentación del módulo font de Pygame está disponible en el capítulo Principales módulos de Pygame.
2. Usar fuentes de caracteres de sistema con Pygame
Comenzamos usando el constructor de SysFont, que permite utilizar una fuente de caracteres disponible en la máquina utilizada....
Diseñar software de dibujo con Pygame
Tan pronto como sepamos cómo mostrar formas geométricas, imágenes, texto y guardar imágenes, podemos decir que tenemos todos los elementos para crear un pequeño software de dibujo.
Todavía es necesario poder captar los eventos del ratón si se quiere usar para dibujar. Esto es lo que veremos inmediatamente antes de construir un pequeño software de dibujo.
1. Administrar eventos de ratón o teclado en Pygame
Ya hemos visto anteriormente la captura de eventos de teclado, que es muy similar con los eventos del ratón.
La base del código es la siguiente:
import pygame, sys
pygame.init()
# VENTANA DE 400 POR 400
PANTALLA = pygame.display.set_mode((400,400))
pygame.display.set_caption("Capítulo 5")
COLOR_NEGRO = pygame.Color(0, 0, 0)
PANTALLA.fill(COLOR_NEGRO)
AVANZA = True
# BUCLE DE JUEGO
while AVANZA:
for event in pygame.event.get():
if event.type == pygame.QUIT:
AVANZA = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
AVANZA = False
elif event.type == pygame.MOUSEBUTTONDOWN:
print(event)
elif event.type == pygame.MOUSEBUTTONUP:
print(event)
pygame.display.flip()
Vemos que tenemos una captura de los eventos del teclado, incluida la pulsación de la tecla [Esc].
for event in pygame.event.get():
if event.type == pygame.QUIT:
AVANZA = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
AVANZA = False
De manera equivalente, capturamos los eventos del ratón: la pulsación y liberación de un botón del ratón.
elif event.type == pygame.MOUSEBUTTONDOWN:
print(event)
elif event.type == pygame.MOUSEBUTTONUP:
print(event)
Mostramos...
Aplicar transformaciones geométricas en Pygame
1. El módulo pygame.transform
El propósito del módulo es aplicar transformaciones geométricas a superficies de Pygame. Entre otras cosas, el módulo ofrece la posibilidad de:
-
simetrías axiales,
-
homotecias,
-
rotaciones.
La documentación del módulo transform de Pygame está disponible en el capítulo Principales módulos de Pygame.
2. Ejemplo de uso de las transformaciones de Pygame
Elegimos mostrar una pequeña imagen a la que aplicaremos diversas transformaciones geométricas. La imagen elegida es la del logotipo de Ediciones ENI, compañía editora de este libro.
El código inicial es el siguiente:
import pygame, sys
import math
PI = math.pi
pygame.init()
# VENTANA DE 400 POR 400 CON UN FONDO NEGRO
PANTALLA = pygame.display.set_mode((400,400))
pygame.display.set_caption("Capítulo 5 - transformaciones")
COLOR_NEGRO = pygame.Color(0, 0, 0)
PANTALLA.fill(COLOR_NEGRO)
#Imagen
logo = pygame.image.load("logo_ENI.png").convert()
PANTALLA.blit(logo, (50, 50))
# BUCLE DE JUEGO
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.flip()
Lo que genera la siguiente...
Conclusión
Ahora que hemos estudiado el dibujo y, por tanto, los aspectos gráficos, se trata de abordar otro aspecto: el relativo al sonido y los efectos sonoros, tan importantes en el desarrollo de videojuegos.