¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Pygame
  3. Sprites con Pygame
Extrait - Pygame Iníciese en el desarrollo de videojuegos en Python
Extractos del libro
Pygame Iníciese en el desarrollo de videojuegos en Python Volver a la página de compra del libro

Sprites con Pygame

La noción de sprite en Pygame

La noción de sprite es fundamental en el desarrollo de videojuegos y, en particular, en el desarrollo de Pygame. Cuando abordamos el desarrollo de un videojuego, nos damos cuenta de que sistemáticamente encontramos el siguiente patrón recurrente: asociar una ubicación de la ventana con una representación gráfica y un conjunto de propiedades. Esto es cierto siempre: para elementos del escenario, las paredes de un laberinto, los personajes, el héroe o la heroína, los enemigos y, en general, para cualquier elemento gráfico del juego. Obviamente esto es cierto para los objetos que se manipulan durante el escenario del juego. Por ejemplo, armas, objetos utilizados por los personajes o el balón de un juego deportivo.

Por lo tanto, podemos pensar en un sprite como un objeto que asocia una ubicación, una representación gráfica (esta o aquella imagen, por ejemplo) y un conjunto de propiedades. Estas propiedades pueden ser un nombre, un texto, valores booleanos que caracterizan el objeto en cuestión (por ejemplo, si el objeto se puede mover o no).

Una posible traducción del término "sprite" podría ser "imagen-objeto" (en el sentido de programación orientada a objetos), que se actualiza con cada iteración del bucle del juego. Pero cuanto más complejo es el juego, más objetos gráficos...

La noción de grupo en Pygame

Por un lado, la manipulación de sprites permite no "reinventar la rueda" con cada programa nuevo, sino ser más eficiente en el desarrollo gracias a otra noción: la de grupo. Un grupo es una colección de sprites. Por lo tanto, un determinado procesamiento se puede aplicar a un conjunto o subconjunto de sprites: por ejemplo, cambiar el color de todos los enemigos o hacer invisibles objetos decorativos de un tipo determinado. Las posibilidades son infinitas. Sobre todo, en una línea en el bucle del juego, puede actualizar una gran cantidad de sprites a la vez.

Gestión simplificada de colisiones

Además, tener el control sobre todos los sprites del juego y, por lo tanto, sobre todos los objetos gráficos del juego, permite ofrecer una gestión de colisiones particularmente simplificada.

Pero, ¿qué es la gestión de colisiones? Es la gestión del encuentro geométrico de dos objetos gráficos. Por ejemplo, el cohete del capítulo Conceptos del videojuego y primeros pasos con Pygame, no puede sobrepasar los bordes en su desplazamiento lateral. Si simulamos el rebote de un balón en el suelo, el encuentro entre el suelo y el balón es una colisión que hay que gestionar. 

Otro ejemplo puede ser un objeto gráfico relacionado con un personaje, que puede agarrar un objeto. El encuentro entre el personaje y el objeto que se va a agarrar es una colisión, igual que la que hay entre una heroína y un enemigo a combatir.

De esta manera, a través de las nociones de sprite y grupo, Pygame ofrece varias funciones que facilitan la gestión de colisiones. Estas funciones son uno de los principales temas de estudio de este capítulo.

Algunas explicaciones sobre la programación orientada a objetos

1. El paradigma del objeto, las líneas principales

La primera idea de la programación orienta a objetos es manipular objetos que representan un concepto de la realidad o no. Por ejemplo, podemos intentar representar un vehículo y considerar que está compuesto por una matrícula, un color de carrocería y un número de puertas (tres o cinco puertas). También queremos saber si el vehículo funciona o no. Por lo tanto, podemos ver el concepto de vehículo como algo que unifica una cadena de caracteres (matrícula), una segunda cadena de caracteres (color), un valor entero (número de puertas) y un booleano que indica si el automóvil funciona o no. Por último, se considera que el vehículo dispone de dos acciones: avanzar (rodar) y detenerse.

El concepto unificador que agrupa propiedades (matrícula, color, etc.) y posibles acciones (avanzar, detenerse) es el de clase. Aquí estamos definiendo el Vehiculo.

Las propiedades que caracterizan la clase Vehiculo (matrícula, color, etc.) se denominan atributos.

Una acción de la clase Vehiculo como detenerse o avanzar, es un método. Un método no es ni más ni menos que una función definida dentro de una clase. Por lo tanto, es necesario "ser" una instancia de dicha clase para poder llamarlo.

Por lo tanto, una clase es un concepto unificador que agrupa una colección de atributos y métodos. Pero por el momento, solo tenemos el modelo, el molde de lo que representa un vehículo, es decir la clase Vehiculo.

Ahora es necesario crear automóviles a partir de este modelo que constituye esta clase Vehiculo. Por ejemplo, tendremos los siguientes vehículos:

  • Matrícula: AR123; color: rojo; número de puertas: 3; posibilidad de hacer avanzar y detener el vehículo.

  • Matrícula: FR456; color: verde; número de puertas: 5; posibilidad de hacer avanzar y detener el vehículo.

Estos dos vehículos diseñados según el modelo de la clase Vehiculo, son instancias de la clase Vehiculo. En resumen, son realizaciones de la clase Vehiculo.

Un último punto de nomenclatura: el método que permite instanciar una clase, es decir, construir una instancia de la clase Vehiculo, se denomina constructor. En Python...

El módulo sprite y su uso

1. El contenido del módulo sprite

En el módulo sprite están las clases Sprite y Group, así como una serie de variaciones de la clase Group. Como recordatorio, las clases de tipo Group son colecciones de objetos Sprite, con diferentes formas de organizarlos y usarlos.

La documentación del módulo sprite de Pygame está disponible en el capítulo Principales módulos de Pygame. Detalla el contenido de las clases Sprite y Group.

2. Creación de un sprite

a. Primer ejemplo de uso

Para ilustrar la creación y el uso de un sprite, vamos a retomar el ejemplo del capítulo Estructura de un juego Pygame, que consiste en hacer rebotar un cuadrado en los bordes laterales de la ventana del juego.

Comenzamos creando una clase CUADRADO que hereda de pygame.sprite. Sprite.

class CUADRADO(pygame.sprite.Sprite): 

Dentro de esta clase, definimos un inicializador cuya primera acción es llamar de manera explícita al inicializador de la clase madre. Por lo tanto, las instancias de la clase CUADRADO se beneficiarán de las características de la clase madre.

def __init__(self): 
 pygame.sprite.Sprite.__init__(self) 

Después completamos la definición del inicializador, definiendo la superficie relativa a la forma geométrica, su color de fondo, sus dimensiones y su posición inicial (en el centro de la ventana de juego).

Como la clase CUADRADO hereda de la clase pygame.sprite.Sprite, también hereda sus atributos que definen la superficie (atributo image) y el posicionamiento de esta superficie (atributo rect).

También definimos un atributo DESPLAZAMIENTO que representa el movimiento en cada iteración.

pygame.sprite.Sprite.__init__(self) 
self.image = pygame.Surface((80, 80)) 
self.image.fill(COLOR_ROJO) 
self.rect = self.image.get_rect() 
self.rect.x = 200 
self.rect.y = 200 
 
self.DEPLAZAMIENTO = 3 

Hasta aquí los atributos. Pero también añadimos un método de clase que resulta ser de gran importancia aquí. Esto se debe a que este método, que es una sobrecarga de un método de la clase madre pygame.sprite.Sprite, se llamará automáticamente en cada iteración del bucle del juego. Por lo tanto, tenemos dos consecuencias positivas:

1. El bucle del juego no está demasiado "cargado"...

Conclusión del capítulo

Ahora tenemos todos los conocimientos necesarios para crear juegos ambiciosos: gráficos, sonido y, con este capítulo, gestión de colisiones. Por lo tanto, podemos desarrollar videojuegos elaborados en Pygame, que es el tema del próximo capítulo.