Cacharreando con PyGame

Como echo de menos mi adolescencia, cuando tenía mas horas para programar juegos. Antaño (1999) surgió un lenguaje de programación llamado DIV Games Studio que causó furor entre la comunidad hispana de programadores. Como toda idea revolucionaria, tenía sus seguidores y sus detractores, pero el caso es que se llegó a editar una revista sobre DIV, y noche tras noche nos reuníamos cerca del centenar de usuarios en el irc-hispano para hablar sobre la programación de videojuegos. Pero la empresa que sacó DIV al mercado cerró al poco de sacar su segunda versión, y esto sentenció la vida de este lenguaje. La gente lejos de quedarse de brazos cruzados, trató de mantener al dia este lenguaje y surgieron varios proyectos con su versión libre de DIV (Fenix y eDIV). A varios colaboradores de sendos proyectos he tenido el gusto de charlar con ellos y aprovecho para mandarles un saludo :)

Aunque proyectos como Fenix han conseguido mantener el lenguaje DIV hasta nuestros dias, su poca aceptación fue desperdigando a la gente hacia otras alternativas. Yo encontré la mia en la combinación de C con SDL, pero quedaba lejos de ser tan fácil como DIV, y los lenguajes basados en BASIC siempre han estado ligados a licencias no libres y a una baja o nula portabilidad.

En python he encontrado la manera mas productiva de desarrollar juegos caseros y seguir disfrutando de este mundo fruto de la combinación de técnica y arte.

Vamos a comentar un ejemplo sencillito, que puede servir a su vez como un esqueleto básico con el que hacer unos primeros pinitos.

Empezaremos incluyendo la/s librerias que nos hacen falta, que por ahora será exclusivamente pygame:

import pygame

Tecnicismos a un lado, esto es algo similar al import de java o al include de C. Ahora veamos como ponemos la maquinaria a rodar:

def main():
print "Python game tutorial 01"

pygame.init()

screen=pygame.display.set_mode( (800,600),pygame.DOUBLEBUF)

Para los nuevos en python, respetar las tabulaciones ! es la forma que tiene este lenguaje para delimitar los bloques de código. Aunque al principio parece algo bizarro, cuando te acostumbras te ayuda a mantener el código algo mas elegante. Bien, pasemos a comentar este trozo. Las tres primeras lineas no tienen mucho que decir, se define la funcion main, se imprime por consola una cadena de texto y se inicializa pygame. Es necesario llamar a pygame.init() antes de cualquier otra función de pygame. Analicemos ahora la cuarta instrucción: pygame.display.set_mode establece el modo gráfico y si lo consigue nos devuelve el buffer para dibujar en el. En el ejemplo se desea una resolución de 800 x 600 pixeles y con la opción de doble buffer (para animaciones mas suaves). Si no se especifica lo contrario, será en modo ventana. La pantalla completa suele dar algun problema que otro, no recomiendo usarla hasta no tener algo estable.

Una vez en marcha pygame y el modo gráfico establecido, es un buen momento para poner a punto las variables de nuestro juego:

 default_fnt=pygame.font.Font(None,24)

quit_request=False
x=0
y=0
dx=1
dy=1

De aquí poco hay que comentar, se genera una fuente de tamaño 24 y se inicializan unas cuantas variables que mas tarde se usarán. Para los mas culebrines, es fácil ver que no hemos declarado las variables, se declaran en el mismo momento que se les asigna por primera vez un valor, a la par que toman el tipo del tipo de dato que se les asigna (Integer, bool, string....) que comodidad no !??? :D

Teniendolo todo preparado, es momento ahora de entrar en un bucle y comenzar la animación. En la primera parte del bucle, vamos a leer la cola de eventos de pygame buscando aquellos eventos que nos interesen, como es el caso de las pulsaciones de teclado. Esto quedaría asi:

while not quit_request:
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit_request=True
if event.type == pygame.KEYDOWN:
if event.key==pygame.K_ESCAPE:
quit_request=True

Tenemos un while, cuyo comportamiento es idéntico al de otros lenguajes, sin misterio alguno, iteraremos mientras se de la condición. La que viene a continuación es un bucle For algo mas propio de lenguajes mas modernos como el caso de C# o java. La función pygame.event.get() nos devuelve una lista con todos los eventos pendientes de ser procesados y la variable event se emplea como variable iteradora. Ahora mismo hacemos mas bien poco, tan solo damos la condición de salir del bucle principal si detectamos que se ha hecho click en cerrar la ventana o se ha pulsado la tecla ESCAPE.

Bueno, de el siguiente código poco hay que comentar, nos valdrá para darle algo de movimiento al programa.

  x=x+dx
y=y+dy
if x>799:
dx=-1
if x<0:
dx=1

if y>599:
dy=-1
if y<0:
dy=1

Hemos leido los eventos del usuario, actualizamos las variables que le dan la lógica a nuestro juego... pero como dibujamos cosas? Hoy solo dibujaremos algo de texto en pantalla.

  screen.fill((0,0,0))  

text_srf=default_fnt.render("Hello World",False,(255,0,0))

screen.blit(text_srf,(x,y))
pygame.display.flip()

Como se vio anteriormente, en screen se guarda la referencia a nuestro buffer gráfico. Se suele emplear el nombre de Surface o Superficie a las imágenes que residen en la memoria RAM. Como no sabemos en que estado está el buffer, lo primero que debemos hacer es limpiarlo, llenandolo ( screen.fill() ) de otro color, como en este caso, que se emplea un negro total para limpiar el buffer. En la segunda linea se genera una superficie con un texto dibujado en su interior, no es dificil ver que se trata de la cadena "Hello World" ^_^

Como si de pegatinas se tratara, tenemos que ir montando el buffer "pegando" en el las imágenes que formaran la animación, personajes, fondo, textos... A estos pegados se les llama blits. Ahora mismo no nos vamos a lucir tanto, y tan solo pegaremos en la pantalla esa imagen con el texto que se ha generado anteriormente, indicando además, las coordenadas donde se debe pegar, siendo las variables x e y en este caso.

Cuando hemos acabado de componer la escena, pygame.display.flip() manda el buffer al monitor y se nos da otro buffer para que en la siguiente iteración del bucle, dibujemos otra vez la escena.

Con todo esto, solo nos queda añadir un par de lineas para completar el ejemplo básico de pygame:

if __name__=="__main__":
main()

Esto no tiene mucho que ver con pygame, es algo de Python. De aquí simplemente entender que cuando se lance el programa se ejecutará la función main anteriormente definida.

Pues esto es python y pygame ! A mi parecer, es tremendamente fácil aunque nunca hay nada exento de polémica. No hay que olvidarse de que no deja de ser un lenguaje de programación imperativo y que como tal, es necesario tener experiencia programando. Querer hacer juegos sin programar normalmente acaba por no dar muy buenos resultados.

Tengo que hacer un par de proyectillos con pygame (Entre ellos el scalextric pseudo digital) así que aprobecharé para colgar mas tutoriales sobre pygame :)

Comentarios

Entradas populares de este blog

Reparando un reproductor de minidisc

Platinum-MD

Preparados para la inmersión!!!