lunes, 9 de julio de 2012

Pygame en dos platos (o tres o más)

Lo Básico


Esta sería la estructura básica de un video juego implementado con Pygame:

01:    #!/usr/bin/env python
02:    # -*- coding: utf-8 -*-
03:    import sys, pygame
04:    pygame.init()
05:    #define las dimensiones y crea la ventana (pantalla)
06:    dimensiones = ancho, alto = 640, 480
07:    pantalla = pygame.display.set_mode(dimensiones)
08:    #define la velocidad del juego
09:    reloj = pygame.time.Clock()
10:    CUADROS_POR_SEGUNDO = 60
11:    #ciclo principal del juego
12:    while True:
13:        reloj.tick(CUADROS_POR_SEGUNDO)
14:        for event in pygame.event.get():
15:            if event.type == pygame.QUIT:
16:                sys.exit()

Comenzaré por comentar sobre las líneas 1 y 2.  La línea uno se incluye para convertir nuestro código en ejecutable bajo linux.  A pesar de que es un comentario, se indica en él el la ubicación del interprete python- esto es notación estándar para cualquier script en bash o python.  Para poder correr nuestro programa al hacer click sobre él, deberiamos marcar en sus propiedades que es ejecutable.  La segunda línea indica que estamos usando codificación utf-8.  Esta códificación es universal, para que nuestro juego no tenga problemas bajo ninguna plataforma con los acentos, las eñes, etc.  He visto que algunos de ustedes (particularmente los que tienen juegos copiados) no incluyen esta línea de comentario en sus scripts y a mi, no sé si a otros, me ha dado problemas al correrlos.

Después de importar los módulos necesarios para nuestro video juego en la línea 3 (casi siempre son esos dos), inicializamos el módulo pygame en la línea 4.  Al hacer esto se inicializan todos los submodulos que necesiten inicialización.  De modo tal que luego de invocar a pygame.init() no es necesario inicializar el módulo font de pygame con pygame.font.init, por ejemplo.

Las líneas 6 y 7 inicializan la pantalla, con lo cual se crea una ventana pygame sobre la cual eventualmente se desplegará el juego.  Nótese que la expresión "640, 480" en la línea 6 es una tupla de python, de modo que la variable "dimensiones" es una tupla.  Sin embargo, en la misma línea tambien estamos asignandole a las variables escalares "ancho" y "alto" los valores 640 y 480 respectivamente.  Esto es una de las particularidades de las asignaciones en python.  En la línea 7, hemos podido haber indicado otro parámetro en la función set_mode, como sigue:

            pygame.display.set_mode(dimensiones, FULLSCREEN)

Con esto tendriamos una ventana que ocupa la pantalla completa, en vez de ser sólo una ventana propiamente.  Otros parametros son:

DOUBLEBUF: que se usa para darle un aspecto de mayor continuidad a las animaciones.  Sin embargo, requiere invocar la función "flip" (como en pygame.display.flip() ) para acutalizar la pantalla en cada ciclo.
OPENGL: para rendición de escenas tridimensionales con PyOpenGL.  Sin embargo, con este parámetro no se permitirá utilizar la mayoría de las funciones de dibujo de Pygame.

Los parámetros se pueden indicar se a varios a la vez en set_mode.

Las líneas 9 y 10 definen el reloj, el cual a su vez marca la pauta de cuán rápido correrá nuestro juego.  La velocidad se mide en cuadros por segundo.  Se dice que el ojo humano no percibe cambios a velocidades mayores a 30 cuadros por segundo, pero cómo el computador tampoco ejecuta todas las instrucciones en el ciclo de juego instantáneamente, quizás sea necesario fijar una velocidad mayor.

A partir de la línea 12 se tiene el ciclo principal del video juego.  Durante todo el ciclo, nuestro programa no responderá a entradas por la cónsola, por lo cual hay que tomar previsiones para recibir las entradas del usuario y poder salir del programa.  En el ciclo de juego se despliega toda la acción del juego.  Esto incluye las animaciones, la detección de colisiones y otros eventos, la actualización del nivel, las vidas, la pantalla, etc.  Es de notar que en nuestro ejemplo de esqueleto, solo realizamos dos acciones dentro del ciclo principal en las líneas 13 y 14-16.  La línea 13 es una invocación a la función tick(), lo cual hace que nuestro programa haga una pausa de tantos milisegundos como sea necesario para que el juego corra a la velocidad indicada por nosotros en cuadros por segundo.  Lás lineas 14 a 16 verifican si ha ocurrido un evento de tipo "Quit", con lo cual nuestro programa finalizaría.

En lo que sigue veremos como desarrollar la acción de nuestro video juego.  Esto incluye el concepto de "superficie", el "blit" y los "sprites", con lo cual podemos implementar las animaciones de figuras sobre un fondo en el video juego.

Referencias


  • Jones, R. (2007). "Rapid Game Development in Python". Documento en línea.
  • Shinners, P. (2002). "Pygame Tutorials".  Disponible en instalación de pygame, para el caso linux, en el directorio usr/share/pyshare/pygame/docs.
  • Sweigart, A. (2010). "Invent Your Own computer Games with Python". 2nda Edición.


No hay comentarios:

Publicar un comentario