Mostrando entradas con la etiqueta fontmanager. Mostrar todas las entradas
Mostrando entradas con la etiqueta fontmanager. Mostrar todas las entradas

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.

Entradas populares