8. Pantalla de presentación
Vamos a añadir una pantalla de presentación, de modo que antes de empezar para partida (y tras terminarla), se muestre una cierta imagen y se espere hasta que pulsemos una tecla.
Ya sabemos cómo cargar esa imagen y cómo mostrarla, así que hay pocas novedades:
- Todo estará dentro de un nuevo bucle externo: antes de cada partida, se mostrará la presentación. Cuando termine la partida, todo volverá a repetirse.
- Mostrar la presentación supone poco más que cargar la imagen, mostrarla y esperar hasta que se pulse "Espacio". Para no hacer trabajar al ordenador al 100% durante esa espera, podemos hacer que entre una comprobación de tecla y la siguiente pase un pequeño espacio de tiempo, por ejemplo 100 milisegundos: pygame.time.wait(100)
- Algunas variables tendrá que "cambiar de sitio": no tiene sentido cargar las imágenes varias veces, así que eso tendrá que estar antes del "while" que repite todo; por el contrario, la posición inicial de cada elemento, y el hecho de que todos ellos sean visibles, sí deberá actualizarse al comienzo de cada nueva partida, de modo que sí deberá repetirse.
Podría ser algo como:
# Mini-invaders, version 0.08 # (Pantalla de presentac.) # Parte de la intro a Pygame, por Nacho Cabanes import pygame from pygame.locals import * import random pygame.init() ancho = 800 alto = 600 cantidadMarcianos = 10 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() imagenUfo = pygame.image.load("ufo.png") rectanguloUfo = imagenUfo.get_rect() imagenMarciano = pygame.image.load("spaceinvader.png") rectangulosMarcianos = { } marcianosVisibles = { } velocidadesX = { } velocidadesY = { } imagenDisparo = pygame.image.load("disparo.png") rectanguloDisparo = imagenDisparo.get_rect() imagenPresent = pygame.image.load("invadersIntro.png") rectanguloPresent = imagenPresent.get_rect() rectanguloPresent.top = 60 rectanguloPresent.left = 80 partidaEnMarcha = True # Nuevo en 0.08 while partidaEnMarcha: # Nuevo en 0.08 # ---- Presentacion ---- pantalla.fill( (0,0,0) ) # Nuevo en 0.08 pantalla.blit(imagenPresent, rectanguloPresent) # Nuevo en 0.08 pygame.display.flip() # Nuevo en 0.08 entrarAlJuego = False # Nuevo en 0.08 while not entrarAlJuego: # Nuevo en 0.08 pygame.time.wait(100) # Nuevo en 0.08 for event in pygame.event.get(KEYUP): # Nuevo en 0.08 if event.key == K_SPACE: # Nuevo en 0.08 entrarAlJuego = True # Nuevo en 0.08 # ---- Comienzo de una sesion de juego ---- rectanguloNave.left = ancho/2 # Movido en 0.08 rectanguloNave.top = alto-50 # Movido en 0.08 rectanguloUfo.top = 20 # Movido en 0.08 for i in range(0,cantidadMarcianos+1): rectangulosMarcianos[i] = imagenMarciano.get_rect() rectangulosMarcianos[i].left = random.randrange(50,751) rectangulosMarcianos[i].top = random.randrange(10,301) marcianosVisibles[i] = True velocidadesX[i] = 3 velocidadesY[i] = 3 disparoActivo = False ufoVisible = True terminado = False # Movido en 0.08 while not terminado: # ---- Comprobar acciones del usuario ---- for event in pygame.event.get(): if event.type == pygame.QUIT: terminado = True partidaEnMarcha = False 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): rectangulosMarcianos[i].left += velocidadesX[i] 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): if marcianosVisibles[i]: 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 for i in range(0,cantidadMarcianos+1): if marcianosVisibles[i]: cantidadMarcianosVisibles = cantidadMarcianosVisibles + 1 if not ufoVisible and cantidadMarcianosVisibles == 0: terminado = True # ---- Dibujar elementos en pantalla ---- pantalla.fill( (0,0,0) ) for i in range(0,cantidadMarcianos+1): 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()
El aspecto de esta presentación podría ser cualquiera. Yo he optado por una que no "pese" mucho, aunque tampoco sea especialmente vistosa: