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
Blog de programación enfocado a estudiantes principiantes de C/C++ en español. Dispone de cursos de todos los niveles y para multitud de usos.
martes, 20 de septiembre de 2011
Game engine: The Next Generation :D
Etiquetas:
como usar xml
,
configuraciones
,
google code
,
Resource manager
,
svn
Entradas populares
-
Una pregunta que me hacen en muchas ocasiones es ¿¿qué significa %2?? La respuesta tiene dos acepciones en función de si lo estamos u...
-
<< Ejemplo anterior Artículos Relacionados Ejemplo siguiente >> Hola a todos, ASCII Art es el hecho de hacer di...
-
Articulo perteneciente a : Referencias de programación Hola a todos Os pongo una aportación que a más de uno le irá bien, un resumen de ...
-
Capítulo perteneciente al tutorial de opengl desde cero Hola a todos, Este capítulo tal vez es de lo más complicados de la teoría necesa...
-
<< Ejemplo anterior Artículos Relacionados Ejemplo siguiente >> Hola a todos, El ejercicio de hoy se basa en c...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> Hola a todos, Este tutorial intenta ser e...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> Hola a todos... Un compañero vuestro ha...
-
Hola a todos... He aquí la primera entrega "Como crear tu propio motor de videojuegos y no morir en el intento". Antes que nada ...
-
Hola a todos Ya que he recibido un par de mails pidiéndome información sobre SEO, os adjunto unos cuantos trucos que he ido aprendiendo du...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> El c apitulo de hoy trata sobre las instrucc...
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.
ResponderEliminarEntonces 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.
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.
ResponderEliminarAdemas 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).
Lo he hecho un poco a piñon, pero creo que funciona.
ResponderEliminarHechadle 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
Hola Pako,
ResponderEliminarSi 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.
kill.. no te lo queria decir, pero... sabes que yo hice los timers del zeleste engine?? :D
ResponderEliminarTal 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...