7. Varios enemigos iguales
Si queremos varios enemigos iguales, en vez de uno solo, no podemos crear una variable "velocidadX" para cada uno, otra "velocidadY" para cada uno, otra "visible" para cada uno y así sucesivamente. Es más razonable usar una estructura repetitiva.
Como primera aproximación, podemos tener un array para los rectángulos, otro para las velocidades, otro para los "visibles"...
Esto supone varios cambios:
- Podemos hacer que los enemigos aparezcan en posiciones al azar. Para generar números al azar tendremos que importar la biblioteca "random": marcianoVisible = True y análogo para el "ufo"
- Tendremos una cierta cantidad de enemigos: cantidadMarcianos = 10
- Y arrays para todos estos datos repetitivos: rectangulosMarcianos = { }, , marcianosVisibles = { }, velocidadesX = { }, velocidadesY = { }
- De modo que ahora todas las operaciones sobre los marcianos serán repetitivas: for i in range(0,cantidadMarcianos+1): marcianosVisibles[i] = True
- Y los valores iniciales de posición de cada marciano los daremos al azar. Por ejemplo, su posición horizontal podría estar entre 50 y 750: rectangulosMarcianos[i].left = random.randrange(50,751)
- Y necesitaremos un contador "cantidadMarcianosVisibles" que nos indique cuántos no hemos destruido aún, para saber cuándo termina la partida.
El resultado es más largo, pero no mucho más difícil:
# Mini-invaders, version 0.07 # (Varios enemigos iguales) # Parte de la intro a Pygame, por Nacho Cabanes import pygame from pygame.locals import * import random # Nuevo en la version 0.07 pygame.init() ancho = 800 alto = 600 cantidadMarcianos = 10 # Nuevo en la version 0.07 terminado = False pantalla = pygame.display.set_mode( (ancho, alto) ) pygame.key.set_repeat(1,25) reloj = pygame.time.Clock() imagenNave = pygame.image.load("nave.png") rectanguloNave = imagenNave.get_rect() rectanguloNave.left = ancho/2 rectanguloNave.top = alto-50 imagenUfo = pygame.image.load("ufo.png") rectanguloUfo = imagenUfo.get_rect() rectanguloUfo.top = 20 imagenMarciano = pygame.image.load("spaceinvader.png") rectangulosMarcianos = { } # Nuevo en 0.07 marcianosVisibles = { } # Nuevo en 0.07 velocidadesX = { } # Nuevo en 0.07 velocidadesY = { } # Nuevo en 0.07 for i in range(0,cantidadMarcianos+1): # Nuevo en 0.07 rectangulosMarcianos[i] = imagenMarciano.get_rect() # Nuevo en 0.07 rectangulosMarcianos[i].left = random.randrange(50,751) # Nuevo en 0.07 rectangulosMarcianos[i].top = random.randrange(10,301) # Nuevo en 0.07 marcianosVisibles[i] = True # Nuevo en 0.07 velocidadesX[i] = 3 # Nuevo en 0.07 velocidadesY[i] = 3 # Nuevo en 0.07 imagenDisparo = pygame.image.load("disparo.png") rectanguloDisparo = imagenDisparo.get_rect() disparoActivo = False ufoVisible = True while not terminado: # ---- Comprobar acciones del usuario ---- for event in pygame.event.get(): if event.type == pygame.QUIT: terminado = True keys = pygame.key.get_pressed() if keys[K_LEFT]: rectanguloNave.left -= 8 if keys[K_RIGHT]: rectanguloNave.left += 8 if keys[K_SPACE] and not disparoActivo: disparoActivo = True rectanguloDisparo.left = rectanguloNave.left + 18 rectanguloDisparo.top = rectanguloNave.top - 25 # ---- Actualizar estado ---- for i in range(0,cantidadMarcianos+1): # Nuevo en 0.07 rectangulosMarcianos[i].left += velocidadesX[i] # Cambia en 0.07 rectangulosMarcianos[i].top += velocidadesY[i] if rectangulosMarcianos[i].left < 0 or rectangulosMarcianos[i].right > ancho: velocidadesX[i] = -velocidadesX[i] if rectangulosMarcianos[i].top < 0 or rectangulosMarcianos[i].bottom > alto: velocidadesY[i] = -velocidadesY[i] rectanguloUfo.left += 2 if rectanguloUfo.right > ancho: rectanguloUfo.left = 0 if disparoActivo: rectanguloDisparo.top -= 6 if rectanguloDisparo.top <= 0: disparoActivo = False # ---- Comprobar colisiones ---- for i in range(0,cantidadMarcianos+1): # Nuevo en 0.07 if marcianosVisibles[i]: # Cambia en 0.07 if rectanguloNave.colliderect( rectangulosMarcianos[i] ): terminado = True if disparoActivo: if rectanguloDisparo.colliderect( rectangulosMarcianos[i]) : marcianosVisibles[i] = False disparoActivo = False if disparoActivo: if rectanguloDisparo.colliderect( rectanguloUfo) : ufoVisible = False disparoActivo = False cantidadMarcianosVisibles = 0 # Nuevo en 0.07 for i in range(0,cantidadMarcianos+1): # Nuevo en 0.07 if marcianosVisibles[i]: # Nuevo en 0.07 cantidadMarcianosVisibles = cantidadMarcianosVisibles + 1 if not ufoVisible and cantidadMarcianosVisibles == 0: # Cambia en 0.07 terminado = True # ---- Dibujar elementos en pantalla ---- pantalla.fill( (0,0,0) ) for i in range(0,cantidadMarcianos+1): # Nuevo en 0.07 if marcianosVisibles[i]: pantalla.blit(imagenMarciano, rectangulosMarcianos[i]) if ufoVisible: pantalla.blit(imagenUfo, rectanguloUfo) if disparoActivo: pantalla.blit(imagenDisparo, rectanguloDisparo) pantalla.blit(imagenNave, rectanguloNave) pygame.display.flip() # ---- Ralentizar hasta 40 fotogramas por segundo ---- reloj.tick(40) # ---- Final de partida ---- pygame.quit()
Y la apariencia sería: