Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Python
  3. Crear videojuegos con Pygame
Extrait - Python Aprenda a programar proyectos lúdicos
Extractos del libro
Python Aprenda a programar proyectos lúdicos Volver a la página de compra del libro

Crear videojuegos con Pygame

Introducción

1. Contexto

En la mayoría de los lenguajes de programación, las funciones se utilizan para interactuar con el teclado o incluso con el ratón. Pero cuando se trata de producir sonido, efectuar visualizaciones de 30 fotogramas por segundo o usar el joystick, nos enfrentamos a un gran vacío. La causa profunda proviene del contexto histórico. De hecho, estas necesidades corresponden esencialmente a las de la industria de los videojuegos. Por lo tanto, librerías especializadas (OpenGl, DirectX) y entornos dedicados (Unity3D, Unreal Engine...) ofrecen paquetes específicos para gestionar 3D, 2D, animaciones, efectos especiales, interacciones con joysticks, gestión de Kinect o cascos de realidad virtual...

Durante mucho tiempo, la oferta se centró en la librería SDL (Simple DirectMedia Library), que permite el control del audio, del teclado, del ratón, del joystick y de la tarjeta 3D. Esta librería, propuesta como una superposición de DirectX y OpenGL, podía ofrecer una forma de simplicidad, en comparación con estos dos gigantes destinados a desarrolladores de alto nivel.

Desafortunadamente, dado que SDL se propone en lenguaje C, sin un entorno de desarrollo dedicado, su uso con los famosos punteros en C ha despistado a más de un usuario. Desarrollar un juego muy simple se convertía en un desafío personal en este contexto y era mejor no aventurarse en él sin ayuda externa.

Afortunadamente, la librería de SDL fue portada a Python, dando a luz a Pygame. Así, tenemos acceso a la misma potencia gráfica que las librerías DirectX y OpenGL, aunque sin disponer de todas las opciones de última generación, ¡pero no nos vamos a quejar! De este modo se evita el uso de punteros, así como la gestión de la memoria de bajo nivel específica para el lenguaje C, y esto hace que un montón de trabajo difícil, lento y de bajo interés desaparezca. Por lo tanto, el tiempo que nos queda disponible podemos dedicarlo a lo esencial: la lógica de las interacciones y las visualizaciones.

Seamos realistas: la semana que viene no vamos a programar la escena de introducción de FarCry o Fallout. Las grandes producciones de juegos en 3D, las famosas producciones Triple-A con grandes presupuestos, requieren docenas y docenas...

Proyecto de la bola que rebota images/etoile.png

1. Presentación del código

Puede encontrar el código fuente del proyecto (para completarlo) descargándolo desde el sitio web de la editorial bajo el nombre de archivo: Pygame_Primeros_pasos.py.

Copie el siguiente código en su editor o descargue y abra el archivo Pygame_Primeros_pasos.py.

# Permite acceder a las funciones del módulo pygame 
import pygame 
# Define los colores RGB 
BLACK = [0, 0, 0] 
WHITE = [255, 255, 255] 
GREEN = [0, 255, 0] 
RED = [255, 0, 0] 
BLUE = [0, 0, 255] 
 
# Inicialización de la pantalla del juego 
pygame.init() 
 
# Inicialización de la ventana del juego 
TamanoPantalla = [400, 300] 
screen = pygame.display.set_mode(TamanoPantalla) 
pygame.display.set_caption("Super Ball") 
 
# Gestión de la frecuencia de refresco de la pantalla 
clock = pygame.time.Clock() 
 
# Posición de inicio 
bola_x = 50 
bola_y = 50 
 
# Velocidad y dirección 
bola_cambio_x = 3 
bola_cambio_y = 3 
 
bola_radio= 5 
 
# El juego continúa mientras el usuario no cierre la ventana 
Terminado = False 
 
# BUCLE PRINCIPAL DEL PROGRAMA 
while not Terminado: 
 # Recupera la lista de los eventos del jugador 
 event = pygame.event.Event(pygame.USEREVENT) 
 
 # EVENTOS 
 # Detecta el clic en el botón cerrar de la ventana 
 for event in pygame.event.get(): 
   if event.type == pygame.QUIT: 
     Terminado = True 
 
 # LÓGICA 
 # Mueve la bola 
 bola_x += bola_cambio_x 
 bola_y += bola_cambio_y 
 
 # Rebote 
 if bola_y > TamanoPantalla[1] or bola_y < 0: 
   bola_cambio_y = bola_cambio_y * -1 
 if bola_x > TamanoPantalla[0] or bola_x < 0: 
   bola_cambio_x = bola_cambio_x * -1 
 
 # VISUALIZACIÓN 
 # Dibuja el fondo 
 screen.fill(WHITE) 
 
 # Colorea los bordes de la pantalla 
 R = [0,0, TamanoPantalla[0],  TamanoPantalla[1]] 
 pygame.draw.rect(screen,GREEN,R ,1) 
 
 # Dibuja el disco del juego 
 pygame.draw.circle(screen,RED,[bola_x,bola_y],bola_radio...
El Proyecto Pong images/etoile.png

1. Historia

Pong es uno de los primeros videojuegos de tipo arcade que conoció un éxito mundial. Fue imaginado por el estadounidense Nolan Bushnell. La compañía Atari lo comercializó en 1972 en máquinas recreativas, y vendió alrededor de 8 000 ejemplares en un año. Puesto que fue un éxito rotundo, en 1975, Pong se vendió en forma de consolas de videojuegos domésticas. Las consolas Atari, así como las creadas por la competencia como imitaciones o variantes, totalizaron varios millones de ventas en los años siguientes: fue una verdadera explosión. Podemos considerar que este éxito global, unido a la producción masiva de consolas de videojuegos, fue el punto de partida de la industria de los videojuegos.

El juego está inspirado en el tenis de mesa, mirándolo desde arriba. Los dos jugadores compiten moviendo cada uno su pala colocada en los bordes izquierdo y derecho. La bola rebota en el borde superior e inferior de la pantalla y, cada vez que sale por el lado izquierdo o derecho, el jugador del lado contrario anota un punto. La puntuación se muestra en la parte superior de la pantalla, en el centro. La simplicidad del juego y su eficaz jugabilidad contribuyeron a su éxito.

2. Primera ejecución

Puede descargar desde el sitio web de la editorial el código fuente del proyecto (para completarlo) bajo el nombre de archivo: Pygame_Pong.py.

Abra el archivo Pygame_Pong.py en su editor de código Python e inicie el programa. Constatará que una pequeña parte del juego ya es funcional. La bola se mueve, la pala o raqueta izquierda se puede controlar usando las teclas [Flecha arriba] y [Flecha abajo] y la bola puede rebotar en ella. Sin embargo, ¡solo rebota en la pared superior, y no en la pared inferior!

images/07RI03.png

En los archivos de ejemplo hallará la corrección del proyecto. Consúltela si se bloquea y no puede avanzar.

3. Presentación del código

Notará que la mitad de las líneas de código son comparables a las del juego anterior. ¿Por qué? Porque hay muchos puntos en común: variables que definen colores, creación de ventanas, bucle de juego principal, gestión de FPS, recuperación de eventos, flip de la zona de dibujo... Así que solo presentamos...

El proyecto Snake images/etoile.pngimages/etoile.png

1. Histórico

Snake («serpiente» en inglés) es un tipo de videojuego en el que un jugador dirige una serpiente que crece durante la partida. Él y sus congéneres potenciales son, por lo tanto, un obstáculo para sí mismos. El objetivo es sobrevivir el mayor tiempo posible recogiendo bonus para aumentar la puntuación.

Realmente no hay una versión de referencia para este juego. De hecho, sus gráficos ultra simples, su ausencia de música y su fondo de pantalla negro no permiten darle una personalidad, en comparación con juegos como Pacman o Tetris. Además, este concepto se puede declinar en versiones muy diferentes, como Tron. Casi desaparecido de la comunidad de videojuegos en la década de 2000, se ha convertido una vez más en un clásico gracias a los dispositivos móviles.

2. Primera ejecución

Puede encontrar la fuente del proyecto (que se debe completar) para su descarga en el sitio web de la editorial bajo el nombre de archivo: Pygame_Snake.py.

El proyecto corregido también está disponible para su descarga bajo el nombre de archivo: Pygame_Snake_corregido.py.

Abra el archivo Pygame_Snake.py en su editor de código Python e inicie el programa. Constatará que una pequeña parte del juego ya es funcional. La serpiente se mueve hacia la derecha, su cabeza aparece de color blanco y su cuerpo en amarillo. La puntuación que se muestra aumenta con el tiempo.

images/07RI04.png

En los archivos de ejemplo está la corrección del proyecto, que puede consultar si se encuentra bloqueado.

3. Presentación del código

No volveremos a presentar el bucle de juego principal de Pygame. Si es necesario, consulte la sección Proyecto de la bola que rebota, al principio del capítulo.

Elegir cómo programar la serpiente no es fácil. De hecho, debe ser capaz de alargarse y, además, se mueve...

Documentación en línea de Pygame

¿Cómo conocer los diferentes parámetros de las funciones de la librería Pygame? De hecho, no hay muchas opciones. Puede preguntar en un foro o, lo que es más rápido, consultar la documentación en línea. La documentación de la librería Pygame está bastante bien hecha. Sin embargo, solo está disponible en inglés. Esto no es un obstáculo normalmente, ya que la documentación técnica informática utiliza una gramática y vocabularios bastante simples. Por otro lado, hay términos técnicos, y eso a veces, no es fácil porque estos términos no están necesariamente presentes en un diccionario inglés-español, dada la especificidad del tema.

Puede ser que no haya una palabra equivalente en español y que el término inglés sea, por lo tanto, habitualmente utilizado por la comunidad. En este caso, es necesario encontrar una fuente de explicación. Por ejemplo, Wikipedia está muy familiarizada con los términos técnicos. Aquí le presentaremos los términos específicos de la librería Pygame e intentaremos descifrar parte de la documentación sobre las funciones de dibujo.

Si no se siente cómodo en inglés, no importa: toda la información necesaria para completar los proyectos se encuentra en el libro.

1. La lista de términos técnicos

  • Width: ancho.

  • Height: altura.

  • Draw: dibujar.

  • Straight linea: línea recta.

  • Render: dibujar en un sentido más general que draw. Podemos decir que draw tiene más que ver con tramas geométricas: círculo, línea recta, rectángulo... y render abarca todas las operaciones gráficas, como el dibujo, pero también los efectos especiales.

  • Rendering: etapa en la que el ordenador realiza todas...

El proyecto Gauntlet images/etoile.pngimages/etoile.png

1. Histórico

En 1985, la compañía Atari Games publicó la máquina recreativa arcade Gauntlet, revolucionaria para la época, pues varios jugadores, cuatro exactamente, podían cooperar para evolucionar dentro de una mazmorra llena de tesoros, monstruos y muchas trampas de todo tipo. Gauntlet se encuentra ahora entre los clásicos de los juegos de acción y el juego también ha sido portado a muchos microordenadores. Como guinda del pastel, al sumergirse en un mundo digno de Dragones y Mazmorras, tiene la opción de elegir uno de los cuatro personajes: un guerrero, un mago, un elfo o una valquiria. Cada uno tiene un arma o poder diferente, con características específicas. La interfaz, con la vista desde arriba, permite tener una buena visión del paisaje y de los meandros del laberinto en el que están inmersos los jugadores.

images/07RI09.png
images/07RI10.png

Gauntlet en la máquina recreativa de Atari y su versión portada a microordenador

Le proponemos configurar las bases de un juego que funcione con el mismo concepto: un aventurero atravesando un laberinto en busca de llaves y tesoros.

Puede encontrar los ejemplos de código en el archivo: Pygame_Laberinto.py.

2. Gestión del laberintos

Almacenamos el plano del laberinto dentro de una lista de string:

LABE = [ 'BBBBBBBBBB', 
         'B        B', 
         'B BB BBBBB', 
         'B B  B   B', 
         'B BB BB  B', 
         'B B   BB B', 
         'B  B  B  B', 
         'BB BB BB B', 
         'B   B    B', 
         'BBBBBBBBBB' ] 

Esta elección técnica está, de hecho, orientada por la práctica. En efecto, la lectura del plano se realiza simplemente mirando la disposición...

El proyecto 1943 images/etoile.pngimages/etoile.pngimages/etoile.png

1. Histórico

images/07RI17.png

He aquí un famoso título de la compañía Capcom, lanzado en 1987. El jugador pilota un avión sobre el Pacífico en medio de la Guerra del Pacífico y se encuentra frente a oleadas de enemigos. Los acorazados y especialmente sus torretas antiaéreas lo obligan a una dura lucha para completar cada nivel. El diseño del juego, basado en el desplazamiento vertical, es muy simple. En cuanto a las misiones, consisten en destruir al jefe del final de cada nivel, lo cual no es particularmente original. Sin embargo, la sencillez del juego y la originalidad de los decorados le dieron cierto éxito; tanto, que el título se distribuyó en todas las consolas y microordenadores de la época.

Puede encontrar la fuente del proyecto (que se debe completar) para su descarga en el sitio web de la editorial bajo el nombre de archivo: Pygame_1943.py.

El proyecto corregido también está disponible para su descarga bajo el nombre de archivo: Pygame_1943_corregido.py.

2. Primera ejecución

Descargue y abra el archivo Pygame_1943.py en su editor de código Python e inicie el programa. Constatará que una pequeña parte del juego ya es funcional. ¡El avión se está moviendo! El acorazado también, pero no parece muy reactivo. El mar pasa por debajo del avión; esto le da un efecto de velocidad. Curiosamente, desaparece poco a poco. En resumen, como ha podido entender, ¡tiene trabajo por delante!

images/07RI18.png
images/07RI19.png

3. Gestión del mar

Ya no presentamos la estructura de bucle de un juego en Pygame. Si no la conoce consulte el proyecto: Proyecto de la bola que rebota, en este mismo capítulo.

MAR = pygame.Surface((ANCHO, ALTURA)) 
pygame.draw.rect(MAR, AZUL, [0,0,ANCHO,ALTURA]) 
for i in range(2000): 
 x = random.randint(0,ANCHO-1) 
 y = random.randint(1,ALTURA-1) 
 MAR.set_at((x, y), BLANCO) 

Para gestionar el mar, creamos una superficie (una imagen) del tamaño de la ventana del juego. La rellenamos de azul. Luego, dibujamos aleatoriamente coordenadas para posicionar píxeles blancos con objeto de simular la espuma de las olas. Esto da un efecto de relieve al desplazarse verticalmente.

En el bucle del juego, con cada iteración, incrementaremos la variable contador. Usaremos su valor para mostrar la imagen del mar en la ventana del juego:...

El Proyecto Iluminación images/etoile.pngimages/etoile.png

1. Contexto

Puede encontrar la fuente del proyecto (para completarla) descargándola en el sitio web de la editorial bajo el nombre de archivo: Pygame_Iluminacion.py.

El proyecto corregido también está disponible para su descarga bajo el nombre de archivo: Pygame_Iluminacion_corregido.py.

Le proponemos implementar una demostración gráfica. El objetivo de este proyecto es simular la iluminación de una habitación. El problema de fondo es el del trazado de rayos. Se trata de un problema básico en la concepción de gráficos 3D. Las imágenes generadas por ordenador que se ven en el cine y en las consolas de videojuegos hacen un uso extensivo de esta técnica.

El trazado de rayos también se utiliza en la gestión de las interacciones de los juegos, por ejemplo, para averiguar si un dron puede detectar su presencia o para saber si su disparo dio en su objetivo o si fue detenido por un obstáculo. El trazado de rayos consiste en enviar una especie de rayo láser desde una fuente y determinar qué objeto se ve afectado por ese rayo.

Para nuestra simulación, tenemos una fuente de luz en la parte inferior de la pantalla, que se mueve de izquierda a derecha. Añadimos paredes en la escena. Como mostramos el terreno desde arriba, estas paredes aparecen como segmentos vistos desde arriba. Su función es detener el trayecto de los rayos de luz. Desde la lámpara, enviamos muchos rayos y mostramos sus trayectorias hasta que se encuentran con un punto de impacto. Aquí tiene un ejemplo de renderizado:

images/RI08_009.png
images/RI08_010.png
images/RI08_011.png

2. Recordatorio de matemáticas

Para este proyecto, debemos calcular la intersección entre un rayo lanzado desde una fuente y un segmento que simboliza nuestra pared. Trabajaremos en 2D, lo que simplificará nuestros cálculos. El punto L define la posición de la fuente de luz; el punto P define un punto distante que indica la dirección del rayo, y los puntos M y K definen los extremos de una pared. He aquí un diagrama que representa la situación:

images/07RI00l.PNG
El producto escalar entre dos vectores es una operación que, a partir de dos vectores, devuelve un número real. Cuando este número es cero, significa que los dos vectores son perpendiculares , y a la inversa, cuando dos vectores son perpendiculares, su producto escalar es cero. El producto...
El Proyecto Tetris images/etoile.pngimages/etoile.pngimages/etoile.png

1. Histórico

Puede encontrar la fuente del proyecto (para completarla) descargándola en el sitio web de la editorial bajo el nombre de archivo: Pygame_Tetris.py.

El proyecto corregido también está disponible para su descarga bajo el nombre de archivo: Pygame_Tetris_corregido.py.

Tetris es un videojuego entre arcade y puzle, diseñado por Aleksey Pajitnov en junio de 1984. Su éxito se vuelve planetario y todas las consolas que salen después de esta fecha incorporan su versión de Tetris. Es uno de los juegos más adictivos de la época, junto con Pacman. El juego consiste, usando solo cuatro teclas, en orientar una pieza hacia la derecha o hacia la izquierda mientras esta cae inexorablemente hacia el fondo de la cuadrícula. También se puede girar sobre sí misma o acelerar su descenso. Una vez que la pieza haya sido bloqueada, ya no puede cambiar su posición y otra pieza llegará a la parte superior del decorado. Y, para consternación del jugador, ¡nunca será la que necesita! Sus enemigos son los agujeros que irá dejando a medida que va apilando de manera torpe estas piezas. Sin embargo, cuando una línea esté completa, desaparecerá y las líneas superiores descenderán un nivel, ¡dejando al jugador una nueva esperanza de supervivencia! El juego se detiene cuando una nueva pieza se bloquea en cuanto aparece en la parte superior de la pantalla. Aquí encontrará capturas de pantalla de Tetris en varias máquinas de la época:

images/07RI36.png

       En GameBoy 1989                       en AtariST 1989                    en PS1 1994

2. Primer lanzamiento

Descargue y abra el archivo Pygame_Tetris.py en su editor de código Python e inicie el programa. Descubrirá que una pequeña parte del juego ya es funcional. Aparece una pieza; baja, baja, pero no se puede mover:

images/07RI37.png

3. Presentación del código

No volveremos a presentar el bucle de juego principal de Pygame. Si es necesario, consulte la sección: Proyecto de la bola que rebota, al principio del capítulo.

Para este proyecto, es necesario dominar...