jueves, 9 de junio de 2011

GameEngine: Capitulo 7 . Font Manager

Hola a todos...

Bienvenidos a la última entrega de esta semana (recordad que el fin de semana es sagrado).

En este capítulo implementaremos el pintado de fuentes y a modo de ejemplo pintaremos los fps a los que corre nuestra aplicación por pantalla.

Las fuentes las implementaremos mediante un FontManager que encapsulará el código glQuickText (.cpp y .h). El código fuente de glQuickText lo podeis encontrar aquí  y es una manera muy sencilla de implementar fuentes. En futuros capítulos añadiremos a este módulo de FontManager la capacidad de trabajar con fuentes mapeadas y otros formatos más usados.

A fin de implementar estos objetivo se han tenido que tocar algunos códigos antiguos. Aquí teneis la lista de cambios:

FontManager.h
/**************************************************************************************************/
// 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
/**************************************************************************************************/

/**************************************************************************************************/
// FontManager.cpp : Código del gestor de fuentes del game engine
// El código de las fuentes renderizadas se obtiene de http://www.mgix.com/snippets/?GLQuickText
/**************************************************************************************************/

#ifndef __FontManager__
#define __FontManager__

#include "MyGL.h"
#include "FileManager.h" //Sirve para cargar el archivo de loading de texturas

#define MAX_ELEMENTS_LOADED 256 //por ahora hardcodeado, lo arreglaremos en algún momento.


class FontManager
{
private:
// Constructor y destructor de la clase
static FontManager instance;
FontManager();
~FontManager();

public:
static FontManager& singleton();

public:
//Funcion para inicializar el motor de sonido
void Init(int* argc, char* argv[]);

//Funcion para desinicializar el motor de sonido
void DeInit();

public:
static void Print(int x , int y, char text[]);

};


#endif // __FileManager__

FontManager.cpp
/**************************************************************************************************/
// 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
/**************************************************************************************************/

/**************************************************************************************************/
// FontManager.cpp : Código del gestor de fuentes del game engine
// El código de las fuentes renderizadas se obtiene de http://www.mgix.com/snippets/?GLQuickText
/**************************************************************************************************/
#include "FontManager.h"
#include "MyGL.h"

#include "glQuickText.h" //Textos renderizados

#include <iostream> //Usada para imprimir por consola

using namespace std;

//Instancia única del FontManager
FontManager FontManager::instance;

FontManager::FontManager()
{
}

FontManager::~FontManager()
{
}

//Devolvemos el puntero al singleton
FontManager& FontManager::singleton()
{
return instance;
}

//Sounds functions
void FontManager::Init(int* argc, char* argv[])
{
cout << "Inicializamos el font manager\n";
}

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

//Pasamos a modo 2D
void switchToOrtho(void)
{
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, 640, 0, 340, -5, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

//Volvemos al modo 3D
void switchBackToFrustum (void)
{
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}

void FontManager::Print(int x , int y, char text[])
{
switchToOrtho();
glQuickText::printfAt((double)x,(double)y, 0.0f ,1.0f , text );
switchBackToFrustum();
}

Dentro del GraphicsManager se añade una función para el calculo de FPS y se modifica el render para que pinte la cadena que deseamos pintar:
//Función de calculo de FPS
int CalcFPS()
{
static clock_t timer = clock(); //Temporizador para los FPS
static int FPS = 0;
static int LastFPS = 0;
FPS++;

if ( (clock() - timer) > 1000 )
{
LastFPS = FPS;
FPS = 0;
timer = clock();
}

return LastFPS;

}

//Funcion que se ejecuta automaticamente desde glut (por ahora)
void GraphicsManager::Render()
{
char cadFPS[50];

//Pintado de la parte de 3D
Graphics3DManager::singleton().Render();
//Pintamos FPS
sprintf(cadFPS,"FPS: %d",CalcFPS());
FontManager::Print(10,10,cadFPS);

//IMPORTANTE: Función encargada de realizar el double-buffering
glutSwapBuffers();
}

NOTA: si quereis que os funcionen estos cambios al inicio del GraphicsManager tendreis que incluir

#include "FontManager.h" //Inclusión del gestor de fuentes

#include <ctime> //Funciones de tiempo

Si todo lo habeís hecho bien ( que sabemos que así será :D ), tendriais que ver por pantalla algo de este estilo:


ejemplo con texturas y fuentes



Espero que os haya servido de ayuda.

Recordad que las variaciones sobre las prácticas y las aportaciones adicionales siempre serán bienvenidas.

LordPakusBlog
Nos vemos, buen fin de semana.

7 comentarios :

  1. Hola, primero felicitarte por este post, y pedirte el favor de facilitarme el código de los primeras, partes, la verdad seguí todos los pasos pero en este me volví loco, en vez de cargar el mapa de bits al cubo, me carga letras en los lados del cubo, agradezco tu tiempo

    ResponderEliminar
  2. Por lo que explicas tienes un problemilla en la carga de la textura (no te la carga bien y te pone en su lugar lo que quiere )...

    El problema es que estoy de vacaciones y no tengo físicamente cerca el código de este capitulo en particular, pero puedes agarrar el de prácticas posteriores que también te irán bien.(en el juego 2D que se está desarrollando se usan fuentes y texturas, así que ahí está bien seguro)

    Siento no poderte ayudar más, si tienes algún otro problema dimelo...

    Nos vemos

    ResponderEliminar
  3. A mí me pasa los mismo que a Alexander Granados, en vez de la textura de madera, el cubo se dibuja usando una textura que supongo es la que usa el FontManager para imprimir texto, ya que si comento la línea
    FontManager::Print(10,10,cadFPS) de la función void GraphicsManager::Render(), el cubo se dibuja correctamente con la textura de madera (si bien no aparece el texto con ls FPS en pantalla).
    Hasta este capítulo he sido capaz de compilar todo el código, pero aquí me he atascado.

    ResponderEliminar
  4. Por cierto, al compilar me aperecen los siguientes errores, que tal vez tienen algo que ver con el problema de las texturas:
    1>SOIL.lib(image_DXT.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'SOIL.lib(image_DXT.obj)' or at 'C:\Users\Jon_Landaburu\Documents\Visual Studio 2010\Projects\GameEngine\Capitulo 07\Debug\vc100.pdb'; linking object as if no debug info
    1>SOIL.lib(image_helper.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'SOIL.lib(image_helper.obj)' or at 'C:\Users\Jon_Landaburu\Documents\Visual Studio 2010\Projects\GameEngine\Capitulo 07\Debug\vc100.pdb'; linking object as if no debug info
    1>SOIL.lib(SOIL.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'SOIL.lib(SOIL.obj)' or at 'C:\Users\Jon_Landaburu\Documents\Visual Studio 2010\Projects\GameEngine\Capitulo 07\Debug\vc100.pdb'; linking object as if no debug info
    1>SOIL.lib(stb_image_aug.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'SOIL.lib(stb_image_aug.obj)' or at 'C:\Users\Jon_Landaburu\Documents\Visual Studio 2010\Projects\GameEngine\Capitulo 07\Debug\vc100.pdb'; linking object as if no debug info
    1>SOIL.lib(image_DXT.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'SOIL.lib(image_DXT.obj)' or at 'C:\Users\Jon_Landaburu\Documents\Visual Studio 2010\Projects\GameEngine\Capitulo 07\Debug\vc100.pdb'; linking object as if no debug info
    1>SOIL.lib(image_helper.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'SOIL.lib(image_helper.obj)' or at 'C:\Users\Jon_Landaburu\Documents\Visual Studio 2010\Projects\GameEngine\Capitulo 07\Debug\vc100.pdb'; linking object as if no debug info
    1>SOIL.lib(SOIL.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'SOIL.lib(SOIL.obj)' or at 'C:\Users\Jon_Landaburu\Documents\Visual Studio 2010\Projects\GameEngine\Capitulo 07\Debug\vc100.pdb'; linking object as if no debug info
    1>SOIL.lib(stb_image_aug.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'SOIL.lib(stb_image_aug.obj)' or at 'C:\Users\Jon_Landaburu\Documents\Visual Studio 2010\Projects\GameEngine\Capitulo 07\Debug\vc100.pdb'; linking object as if no debug info

    ResponderEliminar
  5. Pues la verdad, no te sabría decir. Está claro que es un jaleo con las texturas pero no te sabría decir el que. Si te miras el megaupload aún verás el último código funcional con esto cambiado (la libreria SOIL se cambió).

    En el nuevo game engine esto se hará de manera totalmente diferente.

    Nos vemos...

    ResponderEliminar
  6. Ya he encontrado el fallo!!!
    Estaba en la función void TextureManager::Texture(char id[]).
    He sustituido continue; por break;. La funcion me queda:
    void TextureManager::Texture(char id[])
    {
    int i; //Iterador
    for ( i = 0 ; i < MAX_ELEMENTS_LOADED ; ++i ) //Para cada elemento cargado
    {
    if( !strcmp(loaded[i],id) ) //Hemos encontrado la cadena que nos interesa
    {
    //continue;
    break;
    }
    }

    if ( i == MAX_ELEMENTS_LOADED)
    return;

    //Texturizamos
    glBindTexture(GL_TEXTURE_2D, i);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
    }

    ResponderEliminar
  7. Por si a alguien le puede interesar, en este link dejo el código completo de cada uno de los capítulos. Hasta ahora he llegado al capítulo 7.
    http://www.megaupload.com/?f=7ICHYH16
    Por cierto, yo uso Visual Studio 2010.

    ResponderEliminar

Entradas populares