Tutorial: Escribiendo juegos en Python I
Nota: artículo largo (1200 palabras, ~6 min).
Muchos de nosotros gozamos a diario jugando videojuegos. Y somos muchos los que siempre hemos querido hacer nuestro propio juego. Cuando yo era chico programé infinidad de juegos en mi Atari. Pero programar un juego no es cosa sencilla, y aprender el lenguaje C no es para cualquiera.
Existe una plataforma de código libre para escribir juegos de manera sencilla, en un lenguaje poderoso. Esta es la primera parte de una serie de artículos que escribiré para enseñar a utilizar las librerías pygame para hacer videojuegos. Estas librerías son open-source y están disponibles para las plataformas tradicionales (Linux, MacOSX y Windows).
¿Qué es pygame?
Pygame es un conjunto de librerías para el lenguaje Python que facilitan el escribir juegos. Hacen fáciles tareas complicadas como cargar imágenes, desplegarlas en la pantalla, almacenar y tocar sonidos/música; también te permiten abstraerte de problemas como qué tipo de hardware tienen los usuarios.
Para aprender a usar pygame sólo necesitas tener conocimientos de Python. Como el enfoque de este tutorial no es aprender Python, les dejo la página oficial con tutoriales sobre cómo aprender este lenguaje.
Instalar pygame
La manera más sencilla de instalar Pygame es hacerlo en Linux :D, con un simple comando en el terminal. En Ubuntu la instalación es así:
Se siguen las instrucciones y listo. En la página de Pygame pueden encontrar instrucciones para instalarlo en Windows y MacOSX
Manos a la obra
Lo primero que haremos será crear un archivo de texto llamado "demo1.py", y copiar estas líneas en él. Luego les explicaré qué significan.
from pygame.locals import *
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
def game():
pygame.init()
screen = pygame.display.set_mode( (SCREEN_WIDTH,SCREEN_HEIGHT) )
pygame.display.set_caption( "demo1" )
while True:
keyinput = pygame.key.get_pressed()
if keyinput[K_ESCAPE] or pygame.event.peek(QUIT):
raise SystemExit
if __name__ == '__main__':
game()
Vamos por partes. Con las siguientes líneas lo que hacemos es decir que usaremos las librerías:
from pygame.locals import *
Luego definimos un par de constantes, como la resolución de pantalla que usaremos para nuestro juego:
SCREEN_HEIGHT = 600
Así, nuestro juego correrá en 800x600. Luego escribimos una función llamada "Game". Veamos el cuerpo de la función. Lo primero que hacemos es inicializar los sistemas de pygame:
Después le decimos a pygame la resolución que usaremos y el nombre de nuestro juego. Como lo corremos (por ahora) dentro de una ventana, este nombre es el que se desplegará en el título de la ventana.
pygame.display.set_caption( "demo1" )
Finalmente, entramos a lo que es el ciclo principal del juego. Este ciclo tomará todo el tiempo de juego. Es en este juego en que sucede la inteligencia de los personajes, se calculan las nuevas posiciones, se dibujan los gráficos y se toca la música. Demos un vistazo.
Comenzamos el ciclo:
Ahora le pedimos a Pygame que nos dé un arreglo con todas las teclas que están siendo presionadas en este instante. Y luego vemos si la tecla ESCAPE está presionada. Si esto es así, procedemos a terminar el juego. Para terminar, basta con salir del ciclo principal.
if keyinput[K_ESCAPE] or pygame.event.peek(QUIT):
raise SystemExit
Y por último, estas líneas sirven para que el juego comience. Son líneas típicas de los programas en Python, así que no las explicaremos.
game()
Corriendo nuestro juego
Ha llegado la hora correr el juego. Para eso, simplemente ejecuta este comando en un terminal abierto en la misma carpeta de tu juego:
¿Y qué veremos? Pues muy poco hasta aquí. Simplemente veremos una ventana en negro con el título de nuestro juego. Si presionas la tecla ESCAPE la ventana se cerrará.

No podemos decir que nuestro juego es muy interesante hasta ahora, pero es la base de todos los programas que podrás escribir de ahora en adelante.
Agregando una imagen de fondo
Vamos un poco más allá de lo básico. Agregar una imagen de fondo a nuestro juego es muy sencillo. Primero debemos crear una función que es la que usaremos para leer imágenes desde el disco duro.
try: image = pygame.image.load(filename)
except pygame.error, message:
raise SystemExit, message
image = image.convert()
if transparent:
color = image.get_at((0,0))
image.set_colorkey(color, RLEACCEL)
return image
Esta función es bastante simple. Lo que hace es leer la imagen desde el disco duro y almacenarla en una variable temporal. Si el segundo parámetro es verdadero, entonces la función get_at se usa para obtener el color del pixel en la posición (0,0). Esto lo haremos cuando trabajemos con personajes. Por ahora puedes ignorarlo.
Luego, descarga esta imagen y ponla en la misma carpeta que el juego.
Ahora, los últimos toques al código. Haremos algunas modificaciones al método principal. Antes del ciclo while agregaremos las siguientes líneas:
background_image = load_image('back.jpg');
Lo que hicimos aquí fue crear una superficie. Las superficies son los objetos gráficos de Pygame. Pero esta superficie en particular es la que representa a la ventana principal del juego. Lo que dibujemos en ésta saldrá dibujado en nuestro juego. Luego cargamos la imagen "back.jpg" en memoria y la almacenamos en la variable background_image.
Ahora agregamos bajo el ciclo while estas otras líneas:
pygame.display.flip()
Estas últimas dos líneas hacen que por cada ciclo la imagen de fondo se dibuje sobre la superficie de la pantalla. Los parámetros (0, 0) son para indicarle al intérprete que la esquina superior izquierda de la imagen se dibuje sobre la esquina superior izquierda de la pantalla. En otras palabras, es la posición en la pantalla.
Resultado final
El código final de esta segunda versión sólo es un poco más largo. Veamos:
from pygame.locals import *
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
def load_image(filename, transparent = False):
try: image = pygame.image.load(filename)
except pygame.error, message:
raise SystemExit, message
image = image.convert()
if transparent:
color = image.get_at((0,0))
image.set_colorkey(color, RLEACCEL)
return image
def game():
pygame.init()
screen = pygame.display.set_mode( (SCREEN_WIDTH,SCREEN_HEIGHT) )
pygame.display.set_caption( "demo1" )
background_image = load_image('back.jpg');
while True:
screen.blit(background_image, (0,0) )
pygame.display.flip()
keyinput = pygame.key.get_pressed()
keyinput = pygame.key.get_pressed()
if keyinput[K_ESCAPE] or pygame.event.peek(QUIT):
raise SystemExit
if __name__ == '__main__':
game()
Si lo hiciste todo bien, tipeando "python demo1.py" deberías ver algo como esto:

Bueno, con esto terminamos la primera parte. En la segunda veremos cómo hacer personajes y lograr que éstos se muevan por la pantalla. ¡Nos vemos!
- Alejo's blog
- 3936 lecturas
-
Recomendados por los lectores de Manzana Mecánica
- El Dominio Público — 3 Mar 2010. 396 lecturas.
- Blogger, Twittero: ayuda a informar con fotos y videos libres — 1 Mar 2010. 1.898 lecturas.
- Copyleft — 10 Mar 2010. 239 lecturas.
- (Telefónica de) España no quiere redes de Wi-Fi públicas — 24 Feb 2010. 462 lecturas.
- Reconstruyendo el país (y su sociedad) — 12 Mar 2010. 264 lecturas.
- Privacidad: las tres extensiones imprescindibles para Firefox — 26 Feb 2010. 548 lecturas.
- Un Problema Patente — 17 Mar 2010. 130 lecturas.
Noticias: tag #mmecanica en Twitter
- RT @ChaToX: Le Monde: el sistema actual de patentes sobre medicamentos "atenta contra la vida y la salud de las personas" #mmecanica http://ping.fm/zdN9
- RT @ChaToX: Le Monde: el sistema actual de patentes sobre medicamentos "atenta contra la vida y la salud de las personas" #mmecanica http://ping.fm/zdN9
- RT @ChaToX: Le Monde: el sistema actual de patentes sobre medicamentos "atenta contra la vida y la salud de las personas" #mmecanica http://ping.fm/zdN9






Comentarios
Linux
que es linux...
Que buena idea lo del tutorial
Mi pregunta es muy básica:
¿Hay alguna manera de que el juego se muestre a pantalla completa? ¿Y de detectar el tamaño de la pantalla para adaptarse a ella?
Muchas gracias y enhorabuena por el tutorial.
Saludos
Y la segunda parte???? ya ha
Y la segunda parte????
ya ha pasado un mes y nada.... u.u
Excelente articulo
Hola me parecio excelente el tutorial publicad...
me pregunta si publicaras la 2da parte?...
De cualquier manera Mil gracias....por el esfuerzo...
saludos desde México
wena
wena, siempre quise aprender a utilizar pygame, este es un buen comienzo ...
lo que si creo que te falto aclarar un poco algunas cosas, por ejemplo que hace la función pygame.display.flip()??, cual de todos es el objeto superficie???
en eso me anduve perdiendo ... bueno de todas formas es cosa de buscar en la documentación.
gracias por el tutorial!
Se viene la segunda parte :D
muy pronto
Gracias!!
Gracias por este inicio de tutorial! Siempre me ha llamado la atención Python, y esta es una buena excusa para interiorizarme. Lo estaré siguiendo atento!
Enviar un comentario