
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.