Bienvenidos un día más al curso de Python. En este capítulo vamos empezar a crear nuestro primer videojuego a través de la librería “Pygame”. Como os comenté en el capítulo anterior, esta librería nos proporciona todas las funciones necesarias para poder crear un videojuego de 2 dimensiones. Así que pongámonos manos a la obra.
Crear una ventana
Lo primero que tendremos que hacer es crear una ventana en la que ejecutaremos nuestro videojuego, para ello tendremos que importar las librerías de “Pygame”, y definiremos dos variables globales con las que vamos definir la resolución de la pantalla. A continuación, os mostramos un ejemplo:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ---------------------------
# Importacion de los módulos
# ---------------------------
import pygame
from pygame.locals import *
# -----------
# Constantes
# -----------
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
# ------------------------------
# Clases y Funciones utilizadas
# ------------------------------
# ------------------------------
# Funcion principal del juego
# ------------------------------
def main():
pygame.init()
# creamos la ventana y le indicamos un titulo:
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Mi primer videojuego")
if __name__ == "__main__":
main()
Si os fijais dentro de la función main() usamos “pygame.display.set_mode” y “pygame.display.set_caption”, estas funciones establecen el tamaño de la ventana y el título de esta respectivamente.
Si ejecutamos el código anterior podréis comprobar que la ventana se cierra nada más ejecutarlo. Esto se debe a que no hemos definido el bucle o “loop” principal del juego.
Bucle principal del juego
Los juegos generalmente se ejecutan dentro de un bucle infinito (su bucle principal), lo cual permite que el juego continúe corriendo hasta que se cumpla una condición que lo termine (como por ejemplo que el jugador pierda todas sus vidas o decida cerrar el juego), a continuación tenéis un diagrama que os explica cómo funciona un videojuego:
En nuestro caso el bucle principal se continuará ejecutando hasta que el jugador cierre la ventana. Por lo que el código anterior queda de la siguiente manera:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ---------------------------
# Importacion de los módulos
# ---------------------------
import pygame
from pygame.locals import *
import sys
# -----------
# Constantes
# -----------
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
# ------------------------------
# Clases y Funciones utilizadas
# ------------------------------
# ------------------------------
# Funcion principal del juego
# ------------------------------
def main():
pygame.init()
# creamos la ventana y le indicamos un titulo:
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Mi primer videojuego")
# el bucle principal del juego
while True:
# Posibles entradas del teclado y mouse
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if __name__ == "__main__":
main()
Lo que hace es simple, una vez dentro del bucle, recorre la lista que devuelve “pygame.event.get()” (esta lista contiene todos los eventos que registra “Pygame”, como por ejemplo cuando uno presiona una tecla), si dentro de esa lista está el evento “pygame.QUIT” (o sea cerrar la ventana) el programa ejecuta la orden “sys.exit()” (que termina la ejecución del programa y es parte del módulo “sys”, por este motivo está importado), en caso contrario seguirá esperando.
Cargando el fondo y una imagen
Para cargar las imágenes usaremos “pygame.image.load()”, esta función crea un objeto que contiene la imagen aunque no la mostrará. Después tendremos que indicar las posiciones de esta imagen, para lo cual se usa “blit(imagen, (coordenada_x, coordenada_y))”
Tenemos que pensar que la ventana de “Pygame” es un plano en el que la coordenada (0,0) se encuentra en la esquina superior izquierda de la ventana. Por lo tanto, para desplazarnos hacia la derecha del punto (0,0) tendremos que aumentar el valor de las coordenadas en el eje x (horizontal) y para ir hacia la parte de abajo de la ventana tendremos que aumentar el valor del eje y (vertical).
El punto de referencia de “Pygame” a la hora de posicionar las imágenes es siempre la esquina superior izquierda, no el centro de la imagen como puede ocurrir con otras librerías o lenguajes.
Ahora que ya sabemos sobre coordenadas, vamos a insertar un fondo y una imagen en nuestra ventana, os recomendamos que el fondo sea de las dimensiones de la ventana o superiores, y como imagen cualquiera que tenga el fondo transparente, a continuación os mostramos como se utilizan:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ---------------------------
# Importacion de los módulos
# ---------------------------
import pygame
from pygame.locals import *
import sys
# -----------
# Constantes
# -----------
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
# ------------------------------
# Clases y Funciones utilizadas
# ------------------------------
# ------------------------------
# Funcion principal del juego
# ------------------------------
def main():
pygame.init()
# creamos la ventana y le indicamos un titulo:
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Mi primer videojuego")
# cargamos el fondo y una imagen (se crea objetos "Surface")
fondo = pygame.image.load("fondo.jpg").convert()
tux = pygame.image.load("tux.png").convert_alpha()
# Indicamos la posicion de las "Surface" sobre la ventana
screen.blit(fondo, (0, 0))
screen.blit(tux, (550, 200))
# se muestran lo cambios en pantalla
pygame.display.flip()
# el bucle principal del juego
while True:
# Posibles entradas del teclado y mouse
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if __name__ == "__main__":
main()
Si se fijan, al cargar el fondo hemos utilizado “fondo = pygame.image.load(«fondo.jpg»).convert()” mientras que para la imagen hemos utilizado “tux = pygame.image.load(«tux.png»).convert_alpha()”. Esto se debe a que el fondo no necesita tener un color trasparente (un canal alpha) ya que es la imagen que está bajo todas las demás, en cambio el “sprite”(es la denominación que reciben las imágenes de los videojuegos) que nosotros hemos utilizado, que por el nombre más de uno habrá pensado en el pingüino de Linux, ya lo tenemos definido como “png” y con fondo transparente, por eso utilizamos la función “convert_alpha” porque si no al cargar la imagen del pingüino se vería un feo rectángulo a su alrededor.
Por último utilizamos las funciones “screen.blit(fondo, (0, 0))” y “screen.blit(tux, (550, 200))” para indicar a la aplicación que cargue la imagen del fondo justo en la coordenada (0,0) para que cubra toda la pantalla (cualquier otro valor hubiera dejado el fondo desplazado) y en el caso de “tux” se le indica que lo cargue a la derecha.
Aquí lo dejamos por hoy para que podáis ir asimilando los nuevos conceptos que os hemos explicado, os invitamos como siempre a que vayáis probando todo lo aprendido hasta el momento.
Y para todos los que se acaban de incorporar indicarles que tenemos un índice con todos los capítulos del curso, ya que nunca es tarde para empezar.