2. Movimiento: algo que rebota en pantalla
En un juego real, es habitual que haya "enemigos" que se muevan de forma independiente. Como primer acercamiento, vamos a hacer que el marciano rebote por la pantalla mientras que no pulsemos la [X] para cerrar la ventana del juego.
Lo podríamos conseguir así:
# Mini-invaders, version 0.02 # (Imagen que rebota) # Parte de la intro a Pygame, por Nacho Cabanes import pygame pygame.init() ancho = 800 alto = 600 velocidadX = 3 # Nuevo en la version 0.02 velocidadY = 3 # Nuevo en la version 0.02 terminado = False # Nuevo en la version 0.02 pantalla = pygame.display.set_mode( (ancho, alto) ) imagen = pygame.image.load("spaceinvader.png") rectanguloImagen = imagen.get_rect() rectanguloImagen.left = 300 rectanguloImagen.top = 200 while not terminado: # Nuevo en 0.02 for event in pygame.event.get(): # Nuevo en 0.02 if event.type == pygame.QUIT: terminado = True # Nuevo en 0.02 rectanguloImagen.left += velocidadX # Nuevo en 0.02 rectanguloImagen.top += velocidadY # Nuevo en 0.02 if rectanguloImagen.left < 0 or rectanguloImagen.right > ancho: velocidadX = -velocidadX # Nuevo en 0.02 if rectanguloImagen.top < 0 or rectanguloImagen.bottom > alto: velocidadY = -velocidadY # Nuevo en 0.02 pantalla.fill( (0,0,0) ) # Cambio en 0.02: repetitivo pantalla.blit(imagen, rectanguloImagen) pygame.display.flip() # Nuevo en 0.02: Eliminada la pausa final pygame.quit()
Los cambios son:
- Preparamos la velocidad a la que se moverá el "marciano" (la cantidad de puntos que se desplazará en cada "fotograma" del supuesto "juego"): velocidadX = 3, velocidadY = 3
- Creamos otra variable auxiliar, que nos ayude a repetir todo el juego hasta que llego el momento de terminar. Esa variable ser llamará "terminado", y tiene False como valor inicial, que equivale a decir "no se ha terminado"
- Repetiremos algo mientras que no haya terminado el "juego": while not terminado:
- Revisamos todos los "sucesos" del sistema; si alguno de ellos es una petición de salir del programa (porque se pulse la X de la ventana), anotamos que deberemos terminar: for event in pygame.event.get(): if event.type == pygame.QUIT: terminado=True
- En cada fotograma, desplazamos el "rectángulo del marciano" a la que será su siguiente posición: rectanguloImagen.left += velocidadX, rectanguloImagen.top += velocidadY
- Si se sale por un lado de la pantalla o por el opuesto, en horizontal, cambiamos su "velocidad", para que pase a moverse en dirección contraria: if rectanguloImagen.left < 0 or rectanguloImagen.right > ancho: velocidadX = -velocidadX
- Y hacemos las mismas comprobaciones en vertical: if rectanguloImagen.top < 0 or rectanguloImagen.bottom > alto: velocidadY = -velocidadY
- Ya no hay ninguna pausa final, porque se va a repetir hasta que cerremos la ventana.
El resultado será muy similar al anterior (aunque con la ventana más grande y con movimiento):
Esto ya es algo más difícil, pero... ¿todavía asequible? Pues seguimos...