Desarrollo de videojuegos para PSP con C++ y SDL/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:


#include <pspkernel.h>
#include "engine/application.h"
#include "engine/keyboard.h"

int exit_callback(int arg1, int arg2, void *common) {
	/* Codigo para cerrar correctamente nuestro sistema */
	keyboard->set_quit();
	return 0;
}

int CallbackThread(SceSize args, void *argp) {
	int cbid;
	cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
	sceKernelRegisterExitCallback(cbid);
	sceKernelSleepThreadCB();
	return 0;
}

int SetupCallbacks(void) {
	int thid = 0;
	thid = sceKernelCreateThread("update_thread", CallbackThread, 
		0x11, 0xFA0, 0, 0);
	if(thid >= 0) {
		sceKernelStartThread(thid, 0, 0);
	}
	return thid;
}

/* Necesario para no tener problemas con C++ */
extern "C" int SDL_main (int argc, char* args[]); 

int main(int argc, char *argv[])
{
	/* Preparamos los callbacks */
	SetupCallbacks();
	
	/* Lanzamos nuestro sistema */
	Application app("XML/configuration.xml");

	app.run();
	
	/* Volvemos al sistema operativo */
	sceKernelExitGame();
	
	return 0;	
}


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.