Inicio Noticias en 330 ¿Cómo desarrollar juegos con Python y PyGame?

¿Cómo desarrollar juegos con Python y PyGame?

PyGame es un framework muy popular para desarrollar juegos basados en Python. Es simple y tiene varias herramientas con las que puedes empezar a aprender los conceptos clave para desarrollar un videojuego, con los que luego podrás adentrarte a herramientas mas complejas. Quedate y revisemos, ¿de qué se trata PyGame?

PyGame

Como dijimos, es un framework que te permite empezar a crear tus propios juegos, proporcionando herramientas para que puedas dibujar personajes en pantalla, saber cuando pulsas el teclado o para abrir archivos de música y más. PyGame tiene las herramientas para que puedas:

  • Desplegar una ventana de un tamaño dado
  • Mostrar sprites (imágenes) en la ventana
  • Detectar eventos del teclado o el mouse
  • Programar choques, saltos, o cualquier otra física simple en tu juego
  • Manejar efectos de sonido y música
  • Que tu juego sea multiplataforma, gracias a que está basado en Python.

¿Qué necesitamos?

Para empezar a desarrollar nuestro propio juego, necesitamos un editor de codigo, python y pygame. Por defecto, tu Raspberry Pi ya incluye estos tres. En nuestro caso vamos a usar Geany como editor de codigo, Python 3.9.2, y PyGame 1.9.2, todo esto preinstalado en la version mas reciente de Raspberry Pi OS de 32bits. También será util tener experiencia previa con Python.

Esquema básico de un juego con PyGame

Nuestros programas pueden parecer algo complejos al terminar nuestro código, pero la mayoría de juegos basados en PyGame siguen una estructura básica:

  • Inicializar el juego, declarando variables, definiendo las dimensiones de la ventana y los sprites que vamos a usar
  • Bucle principal del programa. En este ciclo del programa detectamos eventos del teclado o el mouse. Luego calculamos lo que va a pasar en el siguiente fotograma, usando la logica de nuestro juego (algo colisiona con una pared, el personaje salta, algo cambia de color o tamaño, etc)
  • Redibujar la pantalla y volver a ejecutar la lógica del juego para redibujar el siguiente fotograma o finalizar el juego.
Esquema base de un juego basado en PyGame. Vía: 101computing.net

Como quizá te hayas dado cuenta, este procedimiento es muy similar al de un programa en Arduino, en donde tenemos un bloque setup y un bloque loop. Nuestro juego va a configurarse inicialmente y repetirse cuantas veces sean necesarias hasta que algo haga que se termine o cerremos la ventana.

Ejemplo 1 – Configuración inicial

Veamos como iniciar la configuración de tu juego. Empieza abriendo tu editor de código Geany y crea un archivo llamado ejercicio.py en algun lugar de tu carpeta personal. Lo mas elemental será importar las librerias de PyGame en tu codigo, usando import pygame y pygame.init() y acto seguido, dibujar la ventana con pygame.display.set_mode(). Tambien definimos algunas constantes de colores para usar posteriormente. Para esto usaremos las siguientes lineas:

# Import the pygame library and initialize the game engine
import pygame
pygame.init()

# Define some colors
BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
GREEN = ( 0, 255, 0)
RED = ( 255, 0, 0)

# Open a new window
size = (700, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("My First Game")

El código anterior toma la libreria de pygame y la importa a Python, y despues ejecutamos una inicializacion con .init(). Luego definimos el tamaño de la ventana con una tupla que llamamos size (en este caso de 700 pixeles de ancho por 500 de alto). Creamos un objeto llamado screen y usando display.set, le decimos que cree una ventana del tamaño definido en size. Por último, definimos el titulo de la ventana con display.set_caption().

Ejemplo 2 – Loop principal

Veamos ahora una plantilla de lo que necesitaría tu juego en la sección loop para funcionar. A continuación, mostramos las funciones minimas para crear el loop principal, definir cuantas veces se va a refrescar la pantalla y en que momento salimos del juego:

# The loop will carry on until the user exits the game (e.g. clicks the close button).
carryOn = True
 
# The clock will be used to control how fast the screen updates
clock = pygame.time.Clock()
 
# -------- Main Program Loop -----------
while carryOn:
    # --- Main event loop
    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
              carryOn = False # Flag that we are done so we can exit the while loop
 
     # --- Game logic should go here
 
     # --- Drawing code should go here
     # First, clear the screen to white. 
     screen.fill(WHITE)
     #The you can draw different shapes and lines or add text to your background stage.
     pygame.draw.rect(screen, RED, [55, 200, 100, 70],0)
     pygame.draw.line(screen, GREEN, [0, 0], [100, 100], 5)
     pygame.draw.ellipse(screen, BLACK, [20,20,250,100], 2)
 
 
     # --- Go ahead and update the screen with what we've drawn.
     pygame.display.flip()
     
     # --- Limit to 60 frames per second
     clock.tick(60)
 
#Once we have exited the main program loop we can stop the game engine:
pygame.quit()

Esta porción de codigo no mostrará personajes o paisajes de fondo aún, pero es suficiente para decirle a PyGame que abra una ventana de 700×500, y hasta que no presionemos el botón de cerrar ventana, muestre una línea verde, una elipse negra y un rectángulo rojo. También le decimos que actualice la pantalla 60 veces por segundo y que cuando terminemos el loop principal, cierre el juego y la ventana.

Para abrir nuestro ejemplo, nos colocamos en la carpeta donde hayamos guardado nuestro archivo ejercicio.py y ejecutamos el siguiente comando:

python3 ejercicio.py
Resultado del ejercicio. En nuestra ventana de juego vemos un fondo blanco, con tres figuras, y en el encabezado de la ventana My First Game.

Ejemplo 3 – Agregando cambios en la escena

Ok, ya tenemos algunas cosas en nuestra ventana ¿Cómo podemos hacer que el programa reaccione al presionar alguna tecla? Para esto vamos a agregar algunas lineas dentro del ciclo for que manejen un evento del teclado. En este caso, que cambie el color de la linea cuando presionemos la barra espaciadora. Tu programa debe verse algo asi:

# Import the pygame library and initialise the game engine
import pygame, numpy as np
import random
pygame.init()

# Define some colors
BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
GREEN = ( 0, 255, 0)
RED = ( 255, 0, 0)
LINE_COLOR = ( 128, 128, 128)

# Open a new window
size = (700, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("My First Game")

# The loop will carry on until the user exits the game (e.g. clicks the close button).
carryOn = True
 
# The clock will be used to control how fast the screen updates
clock = pygame.time.Clock()
 
# -------- Main Program Loop -----------
while carryOn:
	# --- Main event loop
	for event in pygame.event.get(): # User did something
		if event.type == pygame.QUIT: # If user clicked close
			carryOn = False # Flag that we are done so we can exit the while loop
		elif event.type == pygame.KEYDOWN:
			if event.key == pygame.K_SPACE:
				LINE_COLOR = tuple(np.random.randint(0,255,3))
	# --- Game logic should go hereelif event.type == pygame.KEYDOWN
	# --- Drawing code should go here
	# First, clear the screen to white. 
	screen.fill(WHITE)
	pygame.draw.line(screen, LINE_COLOR, [0, 0], [100, 100], 25)
	pygame.draw.ellipse(screen, BLACK, [20,20,250,100], 2)
	pygame.draw.rect(screen, RED, [55, 200, 100, 30],0)
	# --- Go ahead and update the screen with what we've drawn.
	pygame.display.flip()
	# --- Limit to 60 frames per second
	clock.tick(60)
 
#Once we have exited the main program loop we can stop the game engine:
pygame.quit()

Primero, tenemos la base de lo que programamos en el ejercicio 1 y 2, pero ahora importamos otras librerias llamadas numpy y random. Agregamos una variable llamada LINE_COLOR y dentro del ciclo for, donde detectamos si el usuario cerró la ventana del juego, agregamos elif event.type == pygame.KEYDOWN donde detectamos si el usuario presionó una tecla, y en particular, la barra espaciadora. Si todo salió bien, iniciamos nuestro programa y cada vez que presionamos la barra espaciadora, la línea cambia a un color aleatorio.

Conclusiones

Con estos elementos basicos ya podemos empezar con cosas mas complejas. La estructura principal seguira siendo la misma, pero iremos agregando elementos dentro del loop principal. En las proximas entradas veremos como detectar mas eventos del teclado y mouse para que podamos interactuar con el juego.

¿Quieres mas ejemplos? En el libro CODE THE CLASSICS podras encontrar los códigos para implementar 5 juegos clásicos. Con estos programas podrás aprender más a fondo como usar PyGame, agregar sonidos, imágenes y efectos interesantes a tus juegos.

Referencias:

https://realpython.com/pygame-a-primer/

https://www.101computing.net/pygame-how-tos/