lunes, 27 de junio de 2011

GameEngine: Capitulo 12.Tareas de pintado - Modularizando el game engine (II)

Hola a todos.

Bienvenidos a un nuevo capitulo de como programar un game engine desde 0.

En el capitulo 11 (http://lordpakus.blogspot.com/2011/06/gameengine-capitulo-11statemanager.html) empezamos la tarea de parametrizar nuestro game engine, en este capitulo concluiremos este trabajo.

El objetivo final de la parametrización del game engine es separarlo del código del juego a fin de que el game engine se pueda encapsular en un libreria dinámica o estática separada del código como tal. Para acabar de realizar este cometido solo nos falta que el pintado de gráficos no se haga directamente sino mediante un gestor de tareas que vaya almacenando las tareas de pintado hasta que llegue el momento de renderizar, instante en el cual las vuelque por pantalla. Esto aplica a los gráficos 2D y 3D y su funcionamiento se basa en que las funciones de pintado accesibles por el programador no pintan nada sino que registran tareas.

El código ha quedado de la siguiente manera (me abstengo a poner el .h por que son solamente cabeceras):

Core.cpp:
void Core::DrawSprite(float x, float y, char id[])
{
GraphicsManager::singleton().DrawSprite(x,y,id);
}

void Core::DrawModel(float x, float y, float z, float scale,char id[])
{
GraphicsManager::singleton().DrawModel(x,y,z,scale,id);
}

GraphicsManager.cpp:
void GraphicsManager::DrawSprite(float x, float y, char id[])
{
Graphics2DManager::singleton().InsertDraw(x,y,id); //Insertamos la tarea de pintado
}

void GraphicsManager::DrawModel(float x, float y, float z, float scale, char id[])
{
Graphics3DManager::singleton().InsertDrawModel(x,y,z,scale,id); //Insertamos la tarea de pintado
}

Graphics2DManager.cpp:

typedef struct
{
float x,y;
char cad[256];
}Task2D;


Task2D task2D[256]; //Por ahora hasta 256 tareas de pintado a la vez
int num_task2D;

void Graphics2DManager::InsertDraw(float x, float y, char cad[])
{
task2D[num_task2D].x = x;
task2D[num_task2D].y = y;
sprintf(task2D[num_task2D].cad,"%s",cad);

num_task2D++; //Incrementamos el número de tarea
}

Dentro del render:
//Renderizamos las tareas de pintado. Se tendrá que mejorar
for( i = 0 ; i < num_task2D ; ++i)
{
Draw( task2D[i].x, task2D[i].y, task2D[i].cad) ; //Pintamos la tarea que nos han encomendado
}
num_task2D = 0; //Ya hemos pintado todas las tareas, así que no nos queda ninguna por gestionar.


Graphics3DManager.cpp:
typedef struct
{
float x, y, z, scale;
char cad[256];
}Task3D;

Task3D task3D[256]; //Por ahora hasta 256 tareas de pintado a la vez
int num_task3D;

//Wrapper functions
void Graphics3DManager::DrawModel(float x, float y, float z, float scale, char id[])
{
glPushMatrix();

glTranslatef(x,y,z); // Movemos
glScalef(scale,scale,scale); // Escalamos
ModelManager::singleton().Draw(id); //Pintamos el modelo que hemos cargado previamente.
glPopMatrix();
}

//Wrapper functions
void Graphics3DManager::InsertDrawModel(float x, float y, float z, float scale, char id[])
{
task3D[num_task3D].x = x;
task3D[num_task3D].y = y;
task3D[num_task3D].z = z;
task3D[num_task3D].scale = scale;
sprintf(task3D[num_task3D].cad,"%s",id);

num_task3D++; //Incrementamos el número de tarea
}

Dentro del render:
//Renderizamos las tareas de pintado. Se tendrá que mejorar
for( i = 0 ; i < num_task3D ; ++i)
{
DrawModel( task3D[i].x , task3D[i].y , task3D[i].z , task3D[i].scale , task3D[i].cad) ; //Pintamos la tarea que nos han encomendado
}
num_task3D = 0; //Ya hemos pintado todas las tareas, así que no nos queda ninguna por gestionar.


Esto no significa que que hayamos acabado ya con el game engine, de hecho tan solo hemos empezado.

Si observais el video de youtube:

vereis que la imagen de presentación no cuadra con el tamaño de la pantalla y que de hecho las funcionalidades de pintado que tenemos son muy pobres  ( hecho en el cual nos centraremos más en próximas entregas ), no obstante, estamos un poco más cerca del objetivo de tener nuestro propio motor de juegos. 

El código, como siempre, os lo podeis descargar en la carpeta de megaupload , he mantenido el código de los capitulos 10-11 para que lo podais comparar.

Sin más espero que os haya gustado este capítulo, tengo la esperanza que en breve os pueda subir el pong en el que estoy trabajando.

LordPakusBlog
Nos vemos


0 comentarios :

Publicar un comentario

Entradas populares