Haciendo un cargador de juegos python

Si escribes juegos usando python, seguramente te has encontrado en problemas al distribuir juegos sobre windows.

Python es un gran lenguaje, pero cuando se utiliza con varias bibliotecas
sobre Windows termina siendo algo difícil de transportar de un equipo a otro, y si quieres
presentar tus juegos a muchas personas eso termina convirtiendose en un problema.

En este artículo veremos una alternativa para empaquetar y distribuir nuestros juegos sobre windows de
manera bastante sencilla, crearemos varios cargadores de juegos para bibliotecas como pygame, cocos2d y
pilas-engine.

Un adelanto para impacientes

Si quieres usar cargadores, pero no seguir paso a paso estas instrucciones, ve a la página de github de este proyecto y descarga las versiones listas para utilizar:

¿Que es un cargador de juegos?

Un cargador de juegos es un archivo ejecutable .exe que incluye un intérprete de python y todas las bibliotecas necesarias para ejecutar juegos.

Este intérprete es independiente del juego, lo unico que sabe hacer es "ejecutar un archivo .py", así que los cargadores se hacen una sola vez y luego se comparten, ya sea entre proyectos o entre programadores.

Entonces, lo interesante de un cargador, es que podemos entregarlo a nuestros usuarios junto al código de
nuestro juego y listo, van a poder jugar sin necesidad de configurar o instalar nada mas...

Comenzando

Para iniciar, vamos a comenzar con un sistema windows que no tiene python ni otras
bibliotecas instaladas, solo para comenzar desde el principio.

Mi recomendación es que utilices virtual box, así todo tu entorno permanece independiente de las pruebas que realicemos.

Paso a paso

Primero debes instalado python 2.6.6, la ultima versión binaria para windows está en:

http://www.python.org/download/releases/2.6.6/

Asegurate de instalar python en el directorio c:\Python26:

Luego tendríamos que instalar cx-freeze para la versión 2.6. El sitio de descargas es:

http://cx-freeze.sourceforge.net

Ten en cuenta que aquí estoy usando python 2.6, aunque las mismas instrucciones podrían
funcionar con versiones mas nuevas también.

Creando el cargador básico

Nuestro primer cargador solamente incluirá la biblioteca estándar de python y Tkinter para manejo de interfaz gráfica.

Construye un archivo llamado cargador.py y el siguiente contenido:

import tkMessageBox  
import Tkinter  
import imp  
import sys  
import os

window = Tkinter.Tk()  
window.wm_withdraw()

if not os.path.exists('run.py'):  
    tkMessageBox.showerror("Error", "No se encuentra el archivo run.py")
    sys.exit(1)

try:  
    imp.load_source("__main__", "run.py")
except Exception, e:

    tkMessageBox.showerror("Error", e)

Este programa solamente va a buscar y ejecutar un archivo llamado run.py, y si no lo encuentra va a emitir un mensaje de error:

Generando el archivo ejecutable

El siguiente paso es compilar nuestro cargador para que se pueda ejecutar de manera independiente.

Tenemos que crear dos archivos, setup.py:

from cx_Freeze import setup  
from cx_Freeze import Executable

exe = Executable(  
        script="cargador.py",
        base="Win32GUI",
)

setup(  
    name="Cargador",
    version="0.1",
    description="Un cargador de juegos",
    executables=[exe],
)

y crear_ejecutable.bat:

c:\Python26\python.exe setup.py build
pause

tendríamos que tener un directorio similar al siguiente:

Ahora tienes que ejecutar el archivo crear_ejecutable.bat.

En pantalla debería aparecer todo el proceso de generación del ejecutable:

Al final de la compilación, se habrá generado una carpeta con el
ejecutable del cargador:

Probando el cargador

Ahora la carpeta build tendrá todos los archivos para incluir, excepto el de nuestro programa.

Hagamos un programa sencillo, algo llamado run.py:

import tkMessageBox  
import Tkinter

root = Tkinter.Tk()  
root.withdraw()  
tkMessageBox.showinfo("Hola", "Bienvenido al primer programa de ejemplo")  

Listo, ahora solo hay que colocarlo en la carpeta build y ejecutar el nuevo archivo cargador.exe

Versión 2: añadiendo soporte para pygame

Hasta ahora, tenemos lo principal del cargador de juegos. Aunque no incluye muchas bibliotecas que utilizamos para realizar videojuegos.

Hagamos un pequeño cambio para agregar soporte a pygame.

Primero tenemos de asegurarnos de tener instalada la biblioteca pygame, para nuestra versión de python (2.6) y luego tenemos que editar el archivo setup.py y colocar en la primer linea lo siguiente:

import pygame

por último, tendríamos que ejecutar nuevamente el archivo crear_ejecutable.bat y revisar la carpeta build.

Puedes verlo con mas detalle en github.

Versión 3: con soporte para Cocos2D

Para crear un cargador especial de cocos2d necesitamos instalar pyglet, numpy y luego cocos2d.

Una vez concluido el proceso de instalación, tendríamos que volver
a editar el archivo setup.py e incluir a cocos2d:

import cocos  

Y listo, ahora solo queda ejecutar crear_ejecutable.bat, copiar el archivo
avbin.dll de avbin dentro del directorio build, agregar todas las imagenes que necesite el juego y distribuir nuestro cargador:

Puedes verlo con mas detalle en github.

Version con soporte para pilas-engine

Siguiendo las instrucciones de instalación para pilas-engine sobre windows, instalamos
pyqt4, box2D y luego pilas-engine.

Es importante tener en cuenta que box2D necesita un pequeño cambio como nos indicó barajas en el foro de losersjuegos.

Una vez concluido el proceso de instalación, tendríamos que volver
a editar el archivo setup.py e incluir a pilas-engine:

import pilas

A diferencia de los anteriores, pilas-engine necesita varios archivos de
recursos para funcionar correctamente. Vé al directorio donde se encuentra
el código fuente de pilas-engine en tu equipo, y copia el directorio data
completamente dentro del directorio build que contiene al cargador (y
el archivo run.py)

Ahora sí, ejecutando el cargador obtendremos:

y cuando pulsemos el botón "OK" aparecerá:

Puedes ver un ejemplo de cargador pilas-engine en github.

Finalizando

Los cargadores de juegos son una gran oportunidad para distribuir juegos y hacerlos mucho mas accesibles a los usuarios.

Espero que este documento te resulte útil, y recuerda que tenemos un repositorio en github con la última versión de los cargadores. Estás invitado a participar del desarrollo.

comments powered by Disqus