A través de esta entrada vamos a introducirnos en el mundo del desarrollo de aplicaciones gráficas usando una librería llamada pygame que nos proporciona las herramientas necesarias para crear de forma relativamente sencilla nuestros juegos en el lenguaje de programación Python.
Pygame es un conjunto de módulos que nos ayudan a crear videojuegos o aplicaciones gráficas (no necesariamente videojuegos) en dos dimensiones. Pygame incluye gráficos y bibliotecas de sonido diseñados para ser utilizados directamente bajo Python. Está construido bajo Simple DirectMedia Layer (SDL), que a su vez son un conjunto de bibliotecas desarrolladas en lenguaje C, proporcionando las funciones básicas para realizar operaciones de dibujado 2D, gestión de efectos de sonido y música, y carga y gestión de imágenes. De esta manera, a través de Pygame podemos abstraernos de la lógica del juego (o aplicación) en si mismo, haciendo posible el uso de un lenguaje de alto nivel como Python para estructurar el juego.
Pygame fue contruido como sustituto de pySDL, después del poco éxito del mismo, ya que la forma de interactuar no llegó a recoger tantas opciones y tan simples como las del entorno de Pygame.
Escrito originalmente por Shinners Pete se distribuye bajo la GNU Lesser General Public License. Desde 2004 se trata de un proyecto de código abierto de la comunidad de software libre.
Antes de comenzar a ver una serie de ejemplos generales a modo de introducción en el mundo de Pygame vamos a configurar nuestro sistema para poder importar los módulos de Pygame desde Python, como cualquier otra librería.
La instalación es bastante simple. Suponiendo que nuestro sistema corre una distribución basada en Debian y que ya corre la versión más reciente de Python, de tal forma bastará con usar un gestor de paquetes e instalar el paquete python-pygame y satisfacer todas sus dependencias. Así, y de la forma más intuitiva usaremos las dos vías principales, usando el adminstrador de paquetes en modo texto APT y su versión gráfica Synaptic.
En el primero de los casos la instalación es bastante sencilla, abrimos un terminal y ejecutando como superusuario (root) lanzamos la herramienta apt-get como se indica a continuación y cómo se observa en la figura 1.
$ sudo apt-get install python-pygame
Y nos preguntará si deseamos instalar todos los paquetes anexos y dependencias, a lo que responderemos afirmativamente.
Usando el gestor de paquetes Synaptic la operación es similar, nos dirigimos a System → Administration → Synaptic Package Manager, localizamos el paquete python-pygame y lo marcamos para instalar, cómo se muestra en la figura 2. Aplicamos los cambios aceptando todas las dependencias y listo, ya tenemos nuestro entorno preparado nuestro entornor para empezar a trabajar con Pygame.
Uno de mis entornos de programación preferidos es Geany, un IDE desarrollado en GTK y que se define así mismo como: A fast and lightweight IDE. Aconsejo su uso ya que nos resultará bastante sencillo probar los ejemplos planteados.
Para su instalación, y de forma análoga a Pygame, localizaremos el paquete geany y satisfaceremos sus dependencias si se precisan, así con APT y cómo se muestra en la figura 3:
$ sudo apt-get install geany
Vamos a proceder con un ejemplo muy básico de uso. Abrimos nuestro IDE de Python (Geany) y probamos con el siguiente código, en este se dibujará un fondo sobre una ventana y dos lineas diagonales que cruzarán los extremos de izquierdas a derechas y de arriba a abajo y al contrario. Así, el código comentado:
# -*- coding: utf-8 -*-
# Importamos las librería de Pygame y las del sistema, necesarias para forzar el cierre
import pygame, sys
from pygame.locals import *# Inicializamos Pygame
pygame.init()# Definimos el color de fondo y el de la diagonal
COLOR_FONDO = (50, 150, 200)
COLOR_LINEA1 = (255, 0, 0)
COLOR_LINEA2 = (0, 0, 255)# Definimos el tamaño de la aplicación y la tasa de refresco
pantalla = pygame.display.set_mode((800, 600))
refresco = pygame.time.Clock()while True:
time_passed = refresco.tick(30)
# Comprobamos el cierre de la aplicación y en caso afirmativo lanzamos la función salir
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()# Fijamos el color de fondo y las lineas de diferentes colores, y lo sacamos por display
pantalla.fill(COLOR_FONDO)
pygame.draw.aaline(pantalla, COLOR_LINEA1, (1, 1), (799, 599))
pygame.draw.aaline(pantalla, COLOR_LINEA2, (799, 1), (1, 599))
pygame.display.flip()
NOTA: Para lanzar directamente la aplicación desde el IDE Geany podemos hacerlo pulsando F5 o desde el icono designado para esta operación.
De esta forma, el resultado que obtenemos tras ejecutar nuestra primera aplicación es el mostrado en la figura 4.
Es posible que al empezar en la programación de aplicaciones gráficas mediante Pygame nos surjan dudas acerca del manejo de eventos a través del programa desarrollado. Es por ello que vamos a dedicar este pequeño apartado a tratar de aclarar las diferentes maneras que tenemos para registrar los eventos que se suceden en nuestra aplicación.
Será importante diferenciar los métodos que pueden ayudarnos a registrarlos a guardarlos de una forma temporal antes de ser analizados. Así:
Podemos ver el resto de eventos accesibles por teclado en el siguiente enlace: Documentación oficial de Python.
El ejemplo que muestra su uso, a continuación:
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *pygame.init()
pygame.display.set_mode((200, 200))
pygame.display.flip()
event = pygame.event.poll()while True:
cursor = pygame.mouse.get_pos()
evento = pygame.event.wait()
if evento.type == QUIT or evento.type == K_ESCAPE:
print “Has abandonado la aplicación”
raise SystemExit
if pygame.mouse.get_pressed()[0]:
print “Has usado el botón izquierdo del ratón”
if pygame.mouse.get_pressed()[1]:
print “Has usado el botón central del ratón”
if pygame.mouse.get_pressed()[2]:
print “Has usado el botón derecho del ratón”
if evento.type == KEYDOWN and evento.key == K_SPACE:
print “Has pulsado espacio”
if evento.type == KEYDOWN and evento.key == K_BACKSPACE:
print “Has pulsado backspace”
La figura 5 muestra su ejecución:
Al estar basado en SDL, Pygame tiene la capacidad de poder mostrar imágenes así como formas básica de una forma casi trivial, las primitivas que se encargan de realizar estas operaciones las comentamos en el siguiente ejemplo y vemos su resultado:
# -*- coding: utf-8 -*-
# Importamos las librería de Pygame y las del sistema, necesarias para forzar el cierre
import pygame
from pygame.locals import *# Inicializamos Pygame
pygame.init()# Definimos el color de fondo y el de las figuras
COLOR_FONDO = (50, 100, 50)
COLOR_CUADRADO = (255, 0, 0)
COLOR_CIRCULO = (0, 0, 255)
# Cargamos la imagen y hacemos transparente el fondo (antes verde)
imagen_nave = pygame.image.load(‘nave.bmp’)
imagen_nave.set_colorkey((0, 255, 0))# Definimos el tamaño de la aplicación y la tasa de refresco
pantalla = pygame.display.set_mode((800, 600))while True:
time_passed = pygame.time.Clock().tick(30)
# Comprobamos el cierre de la aplicación y en caso afirmativo lanzamos la función salir
for event in pygame.event.get():
if event.type == QUIT:
raise SystemExit# Fijamos el color de fondo y dibujamos las figuras y la imagen
pantalla.fill(COLOR_FONDO)
pygame.draw.rect(pantalla, COLOR_CUADRADO, (50, 50, 100, 100))
pygame.draw.circle(pantalla, COLOR_CIRCULO, (400, 300), 75 )
pantalla.blit(imagen_nave, (500, 400))
# Actualizamos la pantalla
pygame.display.flip()
NOTA: Podemos ver cómo al no disponer de transparencia la imagen de la nave se la fijamos mediante el método set_colorkey().
Y el resultado lo podemos ver en la figura 6.
Para terminar con esta introducción a Pygame vamos a realizar un test de sonido, para lo cual usaremos la el módulo mixer. El ejemplo:
# -*- coding: utf-8 -*-
import pygame, os
from pygame.locals import*# Iniciamos el módulo mixer
pygame.mixer.init()
# Cargamos la pista de audio haciendo uso del sistema, mediante el cual podemos indicar rutas relativas sin dependencia del sistema operativo
pygame.mixer.music.load(os.path.join(“1vs0_JuniorGroove.ogg”))
# Y reproducimos la pista cargada de forma continua, valor -1.
pygame.mixer.music.play(-1)
Podéis consultar el resto de opciones desde la documentación de Python.
NOTA: La pista de audio utilizada tiene licencia Creative Commons, 1vs0 – Junior Groove.
https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.
Ver comentarios
Genial, hacía tiempo que quería mirar algo de esto, pero me daba un poco para atrás que la mayoría de la documentación está en inglés.
Un buen punto de partida, Gracias.
@PasabaPorAqui: Me alegro que te animes con pygame, si tienes algún problema no dudes en preguntar. Saludos.
FElicitaciones!!!LA verdad que muy buen tutorial.
Lo estuve poniendo en práctica y la verdad que sale todo. Además se entiende. Pero quiero avanzar un poco más y me surgen dudas...
Yo hice un juego con una nave moviéndose de un lugar para otro. Sin embargo, cuando agrego otra nave -la enemiga- en el bucle, resulta que se entrecorta la imagen de ésta; en función de las teclas que apretás por la nave que tenés el control (o sea, la nave con la que jugas). ¿Como resuelvo esto tratando de no utilizar funciones?
SAludos y gracias!!!
Hola
CURSO DE PYGAME
Solo tiene que dirigirse a esta web y seguir los pasos para ingresar antes del 10 de marzo 2010 http://www.aprenderpython.com