Artículo perteneciente a la sección de motores gráficos
Hola a todos,
En este capitulo nos encargaremos de mejorar el pintado de gráficos 2D por pantalla.
Por un lado, haremos que los gráficos se pinten con el tamaño del gráfico original y no a un valor hardcodeado por código y en segundo lugar permitiremos cargar diferentes tipos de formatos gráficos.
Para pintar gráficos con un tamaño especifico solamente hemos de texturizar en un quad del tamaño que a nosotros nos interese. La información del tamaño del quad la perdemos al eliminar el objeto de gráfico, así que tendremos que guardarlo de alguna forma.....
//Creamos una estructura donde almacenaremos el identificador de textura y sus dimensiones
typedef struct
{
int texture; //Almacenamos el identificador de textura
int w,h; //Ancho y largo de la textura original
}TGraf;
//Modificamos la función de carga...
int A2D_Load(char cad[])
{
GLuint tex;
corona::Image* imagen=NULL;
cout << "Cargamos recurso: " << cad << "\n";
imagen = corona::OpenImage(cad, corona::PF_R8G8B8A8 , corona::FF_AUTODETECT);
if(imagen==NULL)
{
cout << "Recurso no cargado\n";
return -1;
}
printf("Ancho:%d Alto:%d\n",imagen->getWidth(),imagen->getHeight());
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imagen->getWidth(), imagen->getHeight(),0, GL_RGBA, GL_UNSIGNED_BYTE, imagen->getPixels());
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
GrafList[index_graf].texture = tex;
GrafList[index_graf].h = imagen->getHeight();
GrafList[index_graf].w = imagen->getWidth();
tex = index_graf;
index_graf++;
delete imagen;
cout << "Recurso cargado\n";
return tex;
}
Y modificamos la función de pintado:
void A2D_Draw(float x, float y, int id)
{
int tex,w,h;
tex = GrafList[id].texture;
w = GrafList[id].w;
h = GrafList[id].h;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glBegin(GL_QUADS);
glTexCoord2f( 1.0f, 1.0f); glVertex2i( x + w , y + h );
glTexCoord2f( 0.0f, 1.0f); glVertex2i( x , y + h );
glTexCoord2f( 0.0f, 0.0f); glVertex2i( x , y );
glTexCoord2f( 1.0f, 0.0f); glVertex2i( x + w , y );
glEnd();
}
En cuanto a usar diferentes formatos gráficos corona nos lo deja muy fácil ya que solo nos pide que usemos la siguiente linea:
imagen = corona::OpenImage(cad, corona::PF_R8G8B8A8 , corona::FF_AUTODETECT);
Finalmente, pondremos un código de ejemplo para comprobar como funciona:
#include "Arnow2D.h"
GLuint graf[10];
void Draw(void)
{
int i,j;
A2D_Draw(0,0,graf[0]);
A2D_Draw(500,0,graf[1]);
A2D_Draw(0,300,graf[2]);
A2D_Draw(500,300,graf[3]);
}
void Main_Loop(void)
{
while(1)
{
//Limpiamos la pantalla
A2D_Clear();
Draw();
//Renderizamos la escena
A2D_Render();
}
}
int main(void)
{
A2D_Init();
graf[0] = A2D_Load("img_test.png");
graf[1] = A2D_Load("images.jpg");
graf[2] = A2D_Load("78bc6b62fEySW.gif");
graf[3] = A2D_Load("ejemplo.bmp");
Main_Loop();
A2D_DeInit();
}
Espero , que aunque sencillo, os haya ayudado, en breve más. Creo que en el próximo capitulo implementaré las z's. Si teneis sugerencias aqui estoy esperandolas
Os dejo el archivo con todo el código y los ejemplos aqui
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.
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...
0 comentarios :
Publicar un comentario