martes, 20 de septiembre de 2011

Game engine: The Next Generation :D

Hola a todos

Como supongo que más de uno estaria esperando la reestructuración del game engine va por buen camino.


Características que ya tenemos implementadas:
0. Tal y como kill me ha recomendado, estoy poniendo el proyecto en el repositorio svn del google code. El problema es que no me resulta demasiado intuitivo y me pierdo para subir todo el proyecto, solo me deja subir de archivo en archivo. Alguien sabe como hacerlo para subir todo el proyecto de golpe??

1. La clase core contiene todo el game engine (principalmente los managers)

2. Se ha creado el Resource Manager que es el encargado de tratar con todos los ficheros del game engine. A la espera de cierto código prometido por killrazor :D. De mientras usamos este módulo para cargar el archivo de configuración general del game engine. Aquí teneís un ejemplo de por donde irán los tiros:
<conf>
  <InputManager>Glut</InputManager>
  <SoundManager>OpenAL</SoundManager>
  <Graphics2DManager>OpenGL</Graphics2DManager>
  <Graphics3DManager>OpenGL</Graphics3DManager>
  <GraphicsASCIIManager>OpenGL</GraphicsASCIIManager>
</conf>

3. Se ha aumentado el nivel de exigencia del sistema. Si algo no funciona como debiera se aborta la carga del motor. Así evitamos problemas posteriores. Esto significa que todas las funciones de Init de los managers devolverán un bool diciendonos si han cargado bien o no.

4. Se ha facilitado mucho la posibilidad de  usar nuevas librerias para cosas ya hechas. Es decir, cambiar la libreria de sonido de OpenAL a BASS o FMOD es trivial. Esto se ha conseguido gracias a la herencia de C++. El core contiene un puntero generico a un manager (SoundManager por ejemplo) y el ResourceManager, en función de la configuración del game engine , se encargará de setearle un puntero a SoundManager_OpenAL o SoundManager_BASS por ejemplo. Mientras que las funciones coincidan en parametros y funcionamiento todo funcionará correctamente.

El código que hay por ahora del ResourceManager (solo es un ejemplo) es el siguiente
/**************************************************************************************************/
//        Código creado por F.Bordas (LordPakus) como ejemplo de creación de un game engine
//        para el blog LordPakus (http://lordpakus.blogspot.com/).
//        Prohibida la distribución fuera de este blog sin el permiso expreso del autor
/**************************************************************************************************/

/**************************************************************************************************/
// ResourceManager.h : Código de la parte de recursos del game engine
/**************************************************************************************************/
#include "ResourceManager.h"

//Lista de managers
#include "Core.h"
#include "SoundManager_OpenAL.h"


#include "tinyxml.h"    //Usada para parsear XML

#include <iostream>        //Usada para imprimir por consola
#include <stdio.h>        //Usada par gestionar ficheros

using namespace std;

ResourceManager::ResourceManager()
{
}

ResourceManager::~ResourceManager()
{
}

//Nos devuelve si ha podido cargar adecuadamente o no.
bool ResourceManager::Init(char *route)
{
    cout << "Inicializamos el Resource manager\n";
   
    TiXmlDocument doc( route);

    //Si el archivo de configuración no existe, abortamos la carga
    if ( !doc.LoadFile() )
    {
        printf( "Could not load file %s. Error = %s. Exiting.\n", route,doc.ErrorDesc() );
        return false;
    }
    cout << "Cargamos el archivo de configuracion " << route << "\n";

    //Empezamos a leer el archivo por el principio
    TiXmlElement *root = doc.RootElement();

    //Cargamos los diferentes managers
    sound = root->FirstChild("SoundManager")->FirstChild()->Value() ;
    input = root->FirstChild("InputManager")->FirstChild()->Value() ;
    graphics2D = root->FirstChild("Graphics2DManager")->FirstChild()->Value() ;
    graphics3D = root->FirstChild("Graphics3DManager")->FirstChild()->Value() ;
    graphicsASCII = root->FirstChild("GraphicsASCIIManager")->FirstChild()->Value() ;

    //Gestionamos los managers
    GestManagers();

    //Si hemos llegado aquí es que hemos podido cargar todo adecuadamente.
    return true;
}

void ResourceManager::DeInit()
{
    cout << "Desinicializamos el Resource manager\n";
}



//Funciones internas del resourcemanager

//Nos dice si un fichero existe o no
bool ResourceManager::ExistFile(char *route)
{
    FILE *fp;

    fp = fopen(route,"r");

    if( fp )
    {
        fclose(fp);
        return true;
    }

    return false;
}

void ResourceManager::GestSoundManager(void)
{
    //Seteamos puntero

    cout << "Sound Manager Driver : " << sound << "\n";
    if( sound.compare("OpenAL") )
    {
        Core::singleton().SetPunteroSoundManager( (SoundManager *) new SoundManager_OpenAL() ) ;
        return;
    }

    //Aquí irian las lineas encargadas de setear los diferntes managers de sonido: ejemplo:
    /*
    if( sound.compare("FMOD") )
    {
        Core::singleton().SetPunteroSoundManager( (SoundManager *) new SoundManager_FMOD() ) ;
        return;
    }

    if( sound.compare("BASS") )
    {
        Core::singleton().SetPunteroSoundManager( (SoundManager *) new SoundManager_BASS() ) ;
        return;
    }
    */
}

void ResourceManager::GestInputManager(void)
{
    cout << "Input Manager Driver : " << input << "\n";
}

void ResourceManager::GestGraphicsManager(void)
{
    cout << "Graphics2D Manager Driver : " << graphics2D << "\n";
    cout << "Graphics3D Manager Driver : " << graphics3D << "\n";
    cout << "GraphicsASCII Manager Driver : " << graphicsASCII << "\n";
}

//Gestionamos la carga de managers
void ResourceManager::GestManagers()
{
    //Gestionamos cada uno de los managers
    GestSoundManager();
    GestInputManager();
    GestGraphicsManager();
}

Espero que os guste,

Nos vemos

LordPakusBlog

5 comentarios :

  1. A ver, lo primero de todo seria crear el proyecto en google. Despues te bajas tortoise svn (para trabajar en windows). Una vez instalado, te haces una carpeta en tu ordenador. Click derecho, checkout y le das la direccion del repositorio de google.
    Entonces ya puedes añadir todos los ficheros que quieras. Cuando los tengas añadidos, haces click derecho, tortoise->add... y empiezas a seleccionar los archivos que quieras. Recuerda no añadir carpetas que deberia crear el IDE, como carpeta debug, ficheros .o, .obj, etc.

    ResponderEliminar
  2. Por cierto, despues puedes añadir a los que quieras, para que aporten codigo. En breve sacare mi codigo de donde lo tengo y tambien lo pondre en google code. Asi podemos fusionar partes que queramos.
    Ademas creo que google code gestion listas de correo para hacer los comentarios mas largos, y mas comodos que los de este bolg (por que se puede meter trozos de codigo, algun adjunto, etc).

    ResponderEliminar
  3. Lo he hecho un poco a piñon, pero creo que funciona.

    Hechadle un ojo a ver que todo el mundo se lo pueda bajar : https://code.google.com/p/lpgameengine/

    Muchas gracias otra vez kill.

    Nos vemos

    ResponderEliminar
  4. Hola Pako,
    Si quieres enviame un mail a ferranferri at gmail punto com
    Lo digo por que los comentarios del blog son un poco incomodos para publicar trozos de codigo y todo eso. Asi te puedo enviar lo de physFS. Por cierto, yo tambien the pasado todo a google code. Esta aqui: https://code.google.com/p/zeleste-engine/

    Veras que la distribucion del proyecto es diferente. Te sugiero que modularices desde el principio por que despues es un dolor, y eso siginifica dividir el codigo en carpetas, dividir en subproyectos para probarlos individualmente, etc.

    ResponderEliminar
  5. kill.. no te lo queria decir, pero... sabes que yo hice los timers del zeleste engine?? :D

    Tal vez me conozcas como Requiem.

    Voy a ver el código a ver si aún conservas el código de cuando era un lechón :D

    Ahora te envío un mail...

    ResponderEliminar

Entradas populares