Crea juegos y simulaciones con Pygame

Crea juegos y simulaciones con Pygame

La capacidad de crear juegos y simulaciones es algo que agrega mucho al currículo de un programador, ya que es necesario utilizar en conjunto varios de los conocimientos esenciales para su formación profesional, como estructuras de datos, orientación a objetos, concurrencia y paralelismo, interfaz humana informática, Inteligencia Artificial, entre otros.

En este artículo hablaremos sobre los juegos en general y cómo usar la biblioteca Pygame de Python para crear proyectos de este tipo.

Dependiendo de la complejidad, desarrollar un juego será uno de los proyectos más desafiantes para un programador, y puede tomar meses o años completarlo, ya que esencialmente estamos creando un mundo completamente nuevo con historia, personajes, desafíos, efectos de sonido, banda sonora, efectos visuales, leyes de la Física y mucho más.


Preparando el ambiente

Para comenzar un nuevo proyecto, primero tenemos que crear un entorno virtual y luego instalar la biblioteca Pygame. Para ello, ejecuta los siguientes comandos en la terminal:


Crea un archivo llamado main.py y dos carpetas, una para imágenes y otra para audio. En la carpeta de imágenes colocarás archivos en formato png o jpg que serán los sprites de tu personaje, el escenario y los obstáculos. En la carpeta de audio, puede colocar archivos en formato mp3 que serán la banda sonora o los efectos de sonido.

Dentro del archivo main.py importaremos la biblioteca, algunas variables importantes, el mezclador para el audio y la biblioteca aleatoria para generar elementos aleatoriamente:


Ahora crearemos la pantalla y el loop infinito, el cual es importante para que el juego siga funcionando hasta que cierres su ventana. En su interior colocaremos una función clock de Pygame, que sirve para limitar el número de veces que se actualiza la pantalla del juego. Sin ella, el ordenador ejecutaría el loop tantas veces como pudiera según su capacidad, por lo que tendríamos diferentes experiencias, dependiendo de los equipos y su configuración.

La función clock previene eso al limitar la cantidad de cuadros diseñados por segundo (también llamados Frames Per Second o FPS):


Dentro de game loop, debemos verificar los eventos para saber si se presionó el botón de cerrar ventana. De ser así, la variable running es definida como false y el loop acaba al cerrarse la ventana. Al ejecutar ese código, verás apenas una pantalla negra.

Lo primero que podemos hacer es cambiar el color de fondo. Por ello, llamamos a la función fill de la ventana y le pasaremos una tupla que contiene tres valores, que hacen referencia a los colores rojo, verde y azul (RGB). Los valores van de 0 a 255 y, con diferentes combinaciones, obtenemos diferentes colores. Todas las funciones para dibujar algo en la pantalla deben llamarse antes de la función pygame.display.update() dentro del loop. En caso contrario, lo que diseñamos no va a aparecer en pantalla.


Añadir formas geométricas

A continuación, agregaremos formas geométricas a la pantalla. Para agregar un círculo, simplemente llama a la función pygame.draw.circle y pasa como parámetro la pantalla donde se dibujará una tupla que contiene los valores RGB, una tupla con la posición en el eje X y la posición en el eje Y en píxeles, el radio del círculo y, por último, tiene un parámetro opcional, es decir, si el círculo estará abierto (solo la línea del borde) o completamente lleno. Es un valor en píxeles que se refiere al grosor del borde. Si no se pasa, se llenará completamente:


Un rectángulo tiene la misma forma. La diferencia es que no se le pasa el radio y dentro de la tupla de posición también hay que especificar la altura y el ancho del rectángulo:


Para dibujar una línea, tenemos que pasar dos tuplas que contengan la posición en el eje X y otra en el eje Y, que representarán el punto de inicio y el punto donde termina la línea.


Finalmente, otra figura que podemos dibujar es un polígono, para lo cual en lugar de la posición se pasa una lista que contiene listas con los valores de la posición en el eje X y el eje Y para cada uno de sus vértices. En el siguiente ejemplo se abordará un triángulo:


La forma en que hacemos que los elementos se muevan es modificando estos valores de posición de las formas geométricas. Este proceso puede ser automático, aumentando y disminuyendo una variable fuera del loop responsable de la posición, o manualmente tomando las entradas del teclado y el mouse. El manual se suele utilizar para mover a tu personaje en el juego, mientras que el automático moverá el resto de objetos:


De esa forma, con cada nuevo procesamiento del loop, el valor para incrementar la posición en el eje X aumentará en 1, lo que hará que el rectángulo se mueva hacia la derecha horizontalmente.

Se podría crear un movimiento oscilatorio que hace que el rectángulo vaya y retroceda, simplemente con la condición de verificar si el valor a incrementar ha pasado cierto punto. Si es así, comenzará a disminuir el valor, pero si no, seguirá incrementando:


Para detectar una colisión entre formas geométricas, solo verifica si la posición de una está dentro de la otra. Para ello, se pueden utilizar varias técnicas, unas más eficientes y otras menos. Algo a tener en cuenta al detectar una colisión es la forma de un objeto. La forma más sencilla de detectarlo son los círculos, ya que solo compruebas si la distancia es menor que la suma de los radios. Algunos objetos tendrán formas diferentes, pero puedes crear puntos de colisión en forma de círculos colocados en los bordes del objeto.

Otro detalle para tener en cuenta es la cantidad de objetos en la pantalla, porque si programas para detectar la colisión de objetos, el costo computacional aumenta exponencialmente a medida que se agregan nuevos objetos. Una forma de evitar este problema es separar la pantalla en bloques y verificar la colisión solo entre los objetos que están en cada bloque.

Las simulaciones físicas también se pueden hacer simplemente modificando la posición del objeto y detectando colisiones con otros objetos. Por ejemplo, puede haber otra variable que incremente el valor de la que usamos para modificar la posición, por lo que la primera variable sería ser la velocidad y la segunda que incrementa a la primera sería la aceleración del objeto. Otro ejemplo de simulación física sería un movimiento circular, que se puede realizar utilizando la biblioteca nativa matemática para calcular el coseno de un ángulo que se sumará a la posición X y el seno del mismo ángulo para sumar la posición Y.


Agregar imágenes para el plano de fondo y personajes

Para añadir las imágenes utilizamos la función pygame.image.load, pasando la ruta a la imagen que queremos cargar y para dibujarla en pantalla usamos la función blit de la pantalla pasando la imagen y una tupla que contiene la posición X e Y:


Para agregar el personaje, lo haremos de la misma manera: cargamos la imagen y luego la dibujamos en la pantalla. Puede ser que algunas imágenes sean muy grandes o muy pequeñas así que, para corregir esto, usamos la función pygame.transform.scale antes de dibujar la imagen en la pantalla:


Las imágenes se colocan en el orden en que se diseñaron, por lo que las diseñadas primero están en la parte inferior y las más recientes en la parte superior. Entonces, cuando diseñes tu personaje y otros objetos, debes dibujarlos después del fondo.


Al igual que las formas geométricas, las imágenes tienen posición X e Y, tamaño y ancho. Puede obtenerlos con la función get_rect del objeto de imagen cargado:


Con la información del rectángulo de la imagen, puedes hacer lo mismo que mencioné con las otras formas geométricas: moverte en el eje X e Y, agregar velocidad, aceleración, detectar colisión, etc.


Generando naves enemigas y obstáculos aleatorios

Con solo usar la biblioteca random para generar números aleatorios, podemos crear una función para generar los enemigos, pasando los números generados como parámetros de posición, velocidad, aceleración e incluso diferentes archivos de imagen. De esta forma, diferentes enemigos y obstáculos pueden aparecer en diferentes posiciones. A continuación, se muestra un ejemplo de este algoritmo:


En este ejemplo comprobamos si la cantidad de elementos en pantalla es menor a cierto número. De ser así genera una probabilidad de agregar un nuevo enemigo y, si esta probabilidad es menor a cierto valor, el objeto de la nave enemiga se genera con los valores aleatorios.


Colocando texto en la pantalla

Para agregar texto a la pantalla, primero iniciamos la función pygame.font.init y luego creamos un objeto que será la fuente, pasando el tipo y el tamaño. Luego usamos la función render de la fuente pasando el texto que queremos, el número 1 para activar el antialias y una tupla con los valores RGB:

En este ejemplo, comprobamos si la cantidad de elementos en pantalla es menor a cierto número. De ser así, genera una probabilidad de agregar un nuevo enemigo y, si esta probabilidad es menor a cierto valor, el objeto de la nave enemiga se genera con los valores aleatorios.


Añadiendo banda y efectos sonoros

Se puede agregar una banda sonora con la función mixer.music.load, la cual recibirá la ruta de la música como parámetro. Luego, simplemente llama a la función mixer.music.play con el parámetro -1, que es para reproducir en loop.


Para los efectos sonoros, utilizamos la función mixer.Sound, pasando la ruta del efecto de sonido y luego llamando a la función play.


El efecto de sonido se puede reproducir cada vez que se lleva a cabo una nueva acción en el juego. Por ejemplo, disparar una pistola láser desde una nave.


Conclusión

En este artículo vimos los conceptos básicos de la creación de juegos usando la biblioteca Pygame. Con los conocimientos aprendidos aquí, ya es posible programar algunas simulaciones y juegos sencillos, creando formas y combinando un poco de matemáticas para modificar la posición del objeto y algoritmos para detectar colisiones. Usando conceptos orientados a objetos, se pueden crear diferentes tipos de juegos con un código más organizado, sin mucha repetición.

El área de desarrollo de juegos es muy amplia y aunque el mercado es muy competitivo, vale la pena invertir tiempo para aprender a crear juegos, ya que siempre hay espacio para juegos que combinan diferentes mecánicas, tecnologías, estilos artísticos y bandas sonoras para crear algo nuevo.

Y este conocimiento no se limita a los juegos, sino que también puedes usarlo al crear simulaciones para trabajar con robótica, biología computacional, física de partículas, ciencia espacial, desarrollo web creando sitios web únicos, entre muchas otras posibilidades.

¡Hasta luego!

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.