# Desarrollo de videojuegos para PSP con C++ y SDL/Texto completo

* Si imprimes esta página, o eliges la opción de Vista preliminar de impresión de tu navegador, verás que desaparecen este cuadro y los elementos de navegación de arriba y de la izquierda, pues no son útiles en una versión impresa.
* Pulsando antes en Refrescar esta página te asegurarás de obtener los últimos cambios del libro antes de imprimirlo.
* Para más información, puedes ver Wikilibros:Versión para imprimir.

## Contenido

* Introducción
* Instalación
* El makefile
* Callbacks de salida al SO
* La pantalla
* Leyendo la entrada de PSP
* Conclusiones
* Texto completo del libro

# Introducción

Me he dispuesto a escribir este tutorial tras haber estado trabajando en el port a PSP de Granny's Bloodbath y encontrar algunas dificultades tanto en la instalación del Kit como en la escritura de un proyecto básico que funcione. Por internet circulan algunos tutoriales similares pero todos cuentan con algún otro error y, o yo soy muy torpe, o se hace bastante complicada la instalación.
Por otro lado, la mayoría se centraban en sistemas Windows y yo quería hacer la instalación sobre Ubuntu.
Espero que esta pequeña guía me sirva a mí como recordatorio para una próxima vez y, si alguien se ve beneficiado pues muchísimo mejor.

# Instalación
## Dependencias

Lo primero que debemos hacer es instalar las dependencias del kit de desarrollo de PSP. Para ello abriremos una terminal e introduciremos el siguiente comando:

## Variables de entorno

Ahora debemos establecer algunas variables de entorno para que el sistema sepa dónde encontrar las nuevas librerías de PSP a la hora de compilar. Editamos el fichero ~/.bashrc y añadimos al final las siguientes líneas:
Cuando reiniciemos el equipo ~/.bashrc volverá a cargarse pero no es necesario hacerlo, podemos ejecutar la siguiente orden:

## Instalación del SDK de PSP

El siguiente paso es descargarnos una copia del directorio trunk del repositorio de ps2dev, el cual contiene todo lo que necesitamos (y más). El repositorio tiene un tamaño considerable y, dependiendo de cómo ande el servidor, puede tardar bastante.
Bueno, si habéis tenido la paciencia suficiente de llegar hasta aquí vamos por buen camino. Ahora toca instalar el toolchain, el kit básico:
Existe un pack de bibliotecas adicionales entre las que se encuentran las SDL llamado psplibraries. Este pack contiene: bzip2, freetype, jpeg, libbulletml, libmad, libmikmod, libogg, libpng, libpspvram, libTremor, libvorbis, lua, pspgl, pspirkeyb, SDL, SDL_gfx, SDL_image, SDL_mixer, SDL_ttf, smpeg-psp, sqlite, zlib y zziplib. Muchas son dependencias de las SDL pero algunas como sqlite (bases de datos), lua (lenguaje de scripting) o pspgl (versión de Open GL para PSP) no tienen nada que ver aunque son muy interesantes también. Lo instalamos de la siguiente manera:
En teoría ya deberíamos estar listos para crear nuestros proyectos en C++ que usen las SDL para PSP, ¡pero no es así! Debe haber algún error en el script anterior porque SDL_mixer no se instala como debería. Hemos de compilar e instalar sus dependencias manualmente. Comenzamos cambiando el propietario de la carpeta donde se instala el kit de desarrollo, sino las bibliotecas no pueden instalarse (al menos yo no he conseguido hacerlo):
Donde group y username son los nombres de nuestro grupo y usuario en el sistema.
Nos dirigimos a instalar libTremor manualmente, dependencia de SDL_mixer:
Finalmente le toca el turno a SDL_mixer y toca seguir el siguiente proceso:

## Finalizamos

Con eso debería bastar, siento el rodeo, si alguien encuentra una manera mejor de instalar el kit de desarrollo para PSP con SDL en GNU/Linux, por favor, que me lo comunique. Entre todos podemos hacer una gran guía.

# El makefile

El makefile para compilar proyectos para PSP tiene ciertas particularidades dignas de mención en esta humilde guía.

## Jerarquía de directorios

Vamos a suponer que tenemos la siguiente jerarquía de directorios:
* Proyecto
** makefile
** main.cpp
** engine
*** ficheros.cpp
*** ficheros.h

## El makefile

Nuestro makefile sería algo similar a lo siguiente:

## Personalización

Podemos personalizar la apariencia de nuestro homebrew en el menú de PSP mediante las siguientes variables:
* PSP_EBOOT_ICON: icono de 144x80 que identificara al juego en la sección $Juegos$ del menú.
* PSP_EBOOT_PIC1: fondo que aparecerá en la consola cuando el juego esté seleccionado, debe tener 480x272.
* PSP_EBOOT_SND0: fichero de sonido en formato at3 que se escuchará cuando nuestro juego esté seleccionado en el menú.

# Callbacks de salida al SO

Seguramente sabréis de qué hablo pero es probable que no os hayáis dado cuenta de que debe ser algo a controlar a la hora de portar la aplicación a PSP. Me refiero a la pausa del juego y a la vuelta al sistema operativo de la consola. En cualquier momento podemos pulsar el botón HOME, seleccionar "salir del juego" y volver al menú principal. Si no tenemos cuidado provocaremos un cuelgue en la consola cada vez que queramos salir.
Tendremos que definir ciertas funciones que actúen como callbacks. Un fichero main.cpp de un port génerico podría ser el siguiente:
Es importante comprender que cuando el usuario decide salir del juego (esperemos que no sea demasiado a menudo) se llama a la función exit_callback por lo que debe ser ella la que se encargue de hacer los cambios pertinentes para romper el game-loop. En mi caso una forma podía ser llamar a la al método set_quit de mi clase keyboard pero en el vuestro puede ser cualquier otro.

# La pantalla

Las dimensiones de la pantalla de la PSP son de 480x272 píxeles por lo que la superficie principal de SDL a crear debe ser exactamente de dichas dimensiones. Por otro lado está la profundidad de color, inicialmente pensé que sería más eficiente bajar dichos niveles de 32bpp a 16bpp o incluso 8bpp si fuera necesario por cuestiones de rendimiento. No obstante, el port de SDL para PSP parece no funcionar correctamente en los dos últimos modos. Finalmente acabé usando 32bpp aunque el rendimiento final es bastante bueno.
La llamada para inicializar SDL en PSP puede ser algo similar a esto:
Con las correspondientes comprobaciones posteriores.

# Leyendo la entrada de PSP
## El problema de SDL_Joystick

Teóricamente, como la mayoría de tutoriales apuntan, podemos usar SDL_Joystick para manejar la entrada del jugador. Se nos presenta una equivalencia entre botones de joystick y de PSP para que podamos manejarla pero lo cierto es que, o soy tremendamente torpe, o este sistema no funciona del todo bien.

## Alternativa

Finalmente, para $Granny's bloodbath$ decidí cambiar la implementación de la clase que manejaba la entrada del jugador (utilizando la API de las librerías de PSP) sin cambiar su interfaz, de ese modo me adaptaba a las circunstancias de PSP sin afectar al resto del sistema.
Las clases que utilicé son las siguientes y funcionan bastante bien:
keyboard.h:
keyboard.cpp:

# Conclusiones

Con todos los detalles anteriormente mencionados creo que es suficiente para poder comenzar a portar los juegos que se creen en PC a PSP (siempre que la potencia, control y detalles similares lo permitan).