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:
Espero que os haya servido de ayuda.
Recordad que las variaciones sobre las prácticas y las aportaciones adicionales siempre serán bienvenidas.

Nos vemos, buen fin de semana.