Curso de videojuegos con Pygame

Animaciones random y grupos de sprites

Capítulo 20: Creando grupos de animaciones con sprites y animaciones random

En este capítulo vamos a añadir animaciones a las explosiones, lo que nos va a dar unos efectos maravillosos.

La idea, es que cuando los disparos del jugador impacten en alguna nave enemiga, esta explote y se muestre la animación con el sonido.

Lo primero que vamos a hacer, es añadir una carpeta para la animación con todas las imágenes.

pygame_capitulo_20/
|-- imagenes/
|-- |-- explosiones/
|-- |-- |-- expl_01_0000.png
|-- |-- |-- expl_01_0001.png
|-- |-- |-- expl_01_0002.png
|-- |-- |-- expl_01_0003.png
|-- |-- |-- expl_01_0004.png
|-- |-- |-- expl_01_0005.png
|-- |-- |-- expl_01_0006.png
|-- |-- |-- expl_01_0007.png
|-- |-- |-- expl_01_0008.png
|-- |-- |-- expl_01_0009.png
|-- |-- |-- expl_01_0010.png
|-- |-- |-- expl_01_0011.png
|-- |-- |-- expl_01_0012.png
|-- |-- |-- expl_01_0013.png
|-- |-- |-- expl_01_0014.png
|-- |-- |-- expl_01_0015.png
|-- |-- |-- expl_01_0016.png
|-- |-- |-- expl_01_0017.png
|-- |-- |-- expl_01_0018.png
|-- |-- |-- expl_01_0019.png
|-- |-- |-- expl_01_0020.png
|-- |-- |-- expl_01_0021.png
|-- |-- |-- expl_01_0022.png
|-- |-- |-- expl_01_0023.png
|-- naves.py

Carguemos estas 24 imágenes de la animación en el código. No vamos a escribir una por una, lo vamos a hacer de una forma más óptima.

Ya expliqué como funcionaba esto en el capítulo anterior.

# Directorios de imágenes

# Directorio de imágenes principal
carpeta_imagenes = os.path.join(carpeta_juego, "imagenes")

# Sub directorios de imágenes
carpeta_imagenes_enemigos = os.path.join(carpeta_imagenes,"enemigos")
carpeta_imagenes_fondos = os.path.join(carpeta_imagenes,"fondos")
carpeta_imagenes_jugador = os.path.join(carpeta_imagenes,"jugador")
carpeta_imagenes_explosiones = os.path.join(carpeta_imagenes, 'explosiones')

Ahora, vamos a añadir un diccionario para poder crear tantos tamaños de explosión como queramos.

En mi código, voy a poner 4 tamaños (t1 a t4).

Después, hay que añadir un bucle que itere todas las imágenes de la carpeta de la animación. Además, en cada tamaño, haremos un pygame.transform.scale() para mostrar diferentes tamaños.

# Explosiones
animacion_explosion1 = {'t1': [], 't2': [], 't3': [], 't4': []}

for x in range(24):
	archivo_explosiones = f'expl_01_00{x:02d}.png'
	imagenes = pygame.image.load(os.path.join(carpeta_imagenes_explosiones, archivo_explosiones)).convert()
	imagenes.set_colorkey(NEGRO)
	imagenes_t1 = pygame.transform.scale(imagenes, (32,32))
	animacion_explosion1['t1'].append(imagenes_t1)
	imagenes_t2 = pygame.transform.scale(imagenes, (64,64))
	animacion_explosion1['t2'].append(imagenes_t2)
	imagenes_t3 = pygame.transform.scale(imagenes, (128, 128))
	animacion_explosion1['t3'].append(imagenes_t3)
	imagenes_t4 = pygame.transform.scale(imagenes, (256, 256))
	animacion_explosion1['t4'].append(imagenes_t4)

Para terminar, tenemos que crear una clase que controle las explosiones. Aquí haremos la magia, qué tamaño se va a cargar en cada momento, a qué velocidad irá la animación, donde aparecerá, etc.

En el vídeo sale todo explicado paso por paso por si no entiendes algo.

class Explosiones(pygame.sprite.Sprite):
def __init__(self, centro, dimensiones):
	pygame.sprite.Sprite.__init__(self)
	self.dimensiones = dimensiones
	self.image = animacion_explosion1[self.dimensiones][0]
	self.rect = self.image.get_rect()
	self.rect.center = centro
	self.fotograma = 0
	self.frecuencia_fotograma = 35
	self.actualizacion = pygame.time.get_ticks()

def update(self):
	ahora = pygame.time.get_ticks()
	if ahora - self.actualizacion > self.frecuencia_fotograma:
		self.actualizacion = ahora
		self.fotograma += 1
		if self.fotograma == len(animacion_explosion1[self.dimensiones]):
			self.kill()
		else:
			centro = self.rect.center
			self.image = animacion_explosion1[self.dimensiones][self.fotograma]
			self.rect = self.image.get_rect()
			self.rect.center = centro

Creamos el grupo de sprites:

explosiones = pygame.sprite.Group()

Le damos un update():

explosiones.update()

Lo dibujamos en la pantalla con draw():

explosiones.draw(pantalla)

Para terminar, nos queda añadir la llamada a la clase para que se haga en el momento de la colisión.

Vamos a la parte donde tenemos las colisiones y ponemos lo siguiente:

	if colision_disparos_amarillos:
	puntuacion += 10
	explosion1.play()
	explosion = Explosiones(enemigo1.rect.center, f't{r}')
	explosiones.add(explosion)

if colision_disparos_verdes:
	puntuacion += 25
	explosion2.play()
	explosion = Explosiones(enemigo2.rect.center, f't{r}')
	explosiones.add(explosion)

if colision_disparos_azules:
	puntuacion += 50
	explosion3.play()
	explosion = Explosiones(enemigo3.rect.center, f't{r}')
	explosiones.add(explosion)

if colision_disparos_rojos:
	puntuacion += 100
	explosion4.play()
	explosion = Explosiones(enemigo4.rect.center, f't{r}')
	explosiones.add(explosion)

Comentarios

Si te quedan dudas sobre el temario, sobre Python, Pygame o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.