martes, 28 de junio de 2011

GameEngine: Capitulo 13.Mejorando el Graphics2DManager (I)

Hola a todos...

Bienvenidos a un nuevo capitulo de como crear nuestro propio game engine.

En el capitulo de hoy nos encargaremos de mejorar el graphics 2D engine.

Una de las deficiencias del capitulo 12 era que no podiamos pintar gráficos a pantalla completa, en este capítulo lo solucionaremos y haremos que el graphics 2D engine sea un poco más versatil.

Para implementar esta característica se ha modificado el sistema de tareas 2D y la función de pintado para que sea genérica.

La función de pintado se ha mejorado para que permita pintar sobre una superficie de tamaño arbitrario y no sobre una de tamaño prefijado:

typedef struct
{
float xi,yi,xf,yf;
char cad[256];
}Task2D;

void Graphics2DManager::Draw(float xi, float yi, float xf, float yf,char cad[])
{
TextureManager::singleton().Texture(cad); //Usamos la textura
glBegin(GL_QUADS);
glTexCoord2f( 1.0f, 0.0f); glVertex2i( xf , yf ); // Top Right Of The Quad (Front)
glTexCoord2f( 0.0f, 0.0f); glVertex2i( xi , yf ); // Top Left Of The Quad (Front)
glTexCoord2f( 0.0f, 1.0f); glVertex2i( xi , yi ); // Bottom Left Of The Quad (Front)
glTexCoord2f( 1.0f, 1.0f); glVertex2i( xf , yi ); // Bottom Right Of The Quad (Front)
glEnd();
}

De la misma manera, las funciones de inserción de tareas de pintado se han adaptado para trabajar con esta función.

//Pinta un gráfico con su tamaño original en las coordenadas x e y
void Graphics2DManager::InsertDraw(float x, float y, char cad[])
{
int w,h;

w = TextureManager::singleton().GetWidth(cad);
h = TextureManager::singleton().GetHeight(cad);

task2D[num_task2D].xi = x;
task2D[num_task2D].yi = y;
task2D[num_task2D].xf = (x+w);
task2D[num_task2D].yf = (y+h);

sprintf(task2D[num_task2D].cad,"%s",cad);

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

//Pinta un gráfico a pantalla completa independientemente de su tamaño original
void Graphics2DManager::InsertDrawFull(char cad[])
{
task2D[num_task2D].xi = 0;
task2D[num_task2D].yi = 0;
task2D[num_task2D].xf = (float) width;
task2D[num_task2D].yf = (float) height;

sprintf(task2D[num_task2D].cad,"%s",cad);

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

Con esto conseguimos no solo poder pintar a pantalla completa sino tener una estructura sobre la cual poder construir las diferentes funciones de pintado 2D (rotados, filtrados,etc...).

Si lo habéis implementado bien tendría que quedaros algo de este estilo...


El codigo lo teneis en el "repositorio" del megaupload. Os he dejado los capitulos anteriores por si quereis comparar código. Espero que hayáis aprendido y que os lo hayáis pasado bien.. en breves dias subiré el pong.

LordPakusBlog
Nos vemos

0 comentarios :

Publicar un comentario

Entradas populares