Herramientas Para el Desarrollo de Videojuegos y Lenguajes de Programación en Español
martes, 19 de mayo de 2015
Manejador de Assets 3.0, Agregando Fuentes
ManejadorAssets.h
#ifndef MANEJADOR_ASSETS_H
#define MANEJADOR_ASSETS_H
#include <SFML\Graphics.hpp>
#include <SFML\Audio.hpp>
#include <map>
#include <string>
class ManejadorAssets
{
public:
//constructor
ManejadorAssets();
//funcion estatica para obtener las texturas
static sf::Texture &obtenerTextura(std::string const &nombreArchivo);
//funcion estatica para obtener el sonido del buffer
static sf::SoundBuffer &obtenerSonidoBuffer(std::string const &nombreArchivo);
//funcion estatica para obtener la fuente
static sf::Font &obtenerFuente(std::string const &nombreArchivo);
private:
//mapa que me servira manejar las texturas por medio de identificadores de cadenas
std::map<std::string, sf::Texture> m_Texturas;
//mapa que me servira manejar los buffer de sonido por medio de identificadores de cadenas
std::map<std::string, sf::SoundBuffer> m_sonidosBuffer;
//mapa que me servira manejar las fuentes por medio de identificadores de cadenas
std::map<std::string, sf::Font> m_Fuentes;
//El manejador de assets es un singleton, esto solo es una instancia que puede
//existir al mantener un puntero estatico en una simple instancia del manejador
static ManejadorAssets *sIntancia;
};
#endif
ManejadorAssets.cpp
#include "ManejadorAssets.h"
#include <assert.h>
//inicializo mi instancia a 0 o nulo
ManejadorAssets *ManejadorAssets::sIntancia = nullptr;
//definicion del constructor
ManejadorAssets::ManejadorAssets()
{
//Solo permite un Manejador de Assets si no manda una excepcion
//macro assert que verifica si la expresion es correcta
assert(sIntancia == nullptr);
sIntancia = this;
}
//definicion de obtenerTextura
sf::Texture &ManejadorAssets::obtenerTextura(std::string const &nombreArchivo)
{
auto &mapTextura = sIntancia->m_Texturas;
//observamos si la textura esta lista para cargarlas
auto pairFound = mapTextura.find(nombreArchivo);
//Si esta lista regresamos la textura
if (pairFound != mapTextura.end())
{
return pairFound->second;
}
//si no carga la textura la regresamos
else
{
//Creamos el elemento del map de la textura
auto &textura = mapTextura[nombreArchivo];
textura.loadFromFile(nombreArchivo);
return textura;
}
}
//definicion de obtenerSonidoBuffer
//Formatos de audio: ogg, wav, flac, aiff, au, raw, paf, svx, nist,
//voc, ircam, w64, mat4, mat5 pvf, htk, sds, avr, sd2, caf, wve, mpc2k, rf64
//aun no tiene soporte para formato mp3 :(
sf::SoundBuffer &ManejadorAssets::obtenerSonidoBuffer(std::string const &nombreArchivo)
{
auto &mapSonidoBuffer = sIntancia->m_sonidosBuffer;
//observamos si el sonido esta listo para cargarse
auto pairFound = mapSonidoBuffer.find(nombreArchivo);
// Si esta listo regresamos el sonido
if (pairFound != mapSonidoBuffer.end())
{
return pairFound->second;
}
//si no carga el sonido la regresamos
else
{
//Creamos el elemento del map del sonido buffer
auto &sonido = mapSonidoBuffer[nombreArchivo];
sonido.loadFromFile(nombreArchivo);
return sonido;
}
}
//definicion de obtenerFuente
//formatos: TrueType (TTF), Type 1, CFF, OpenType, SFNT,
//X11 PCF, Windows FNT, BDF, PFR, y Type 42
sf::Font &ManejadorAssets::obtenerFuente(std::string const &nombreArchivo)
{
auto &mapFuente = sIntancia->m_Fuentes;
//observamos si la fuente esta lista para cargarse
auto pairFound = mapFuente.find(nombreArchivo);
// Si esta listo regresamos la fuente
if (pairFound != mapFuente.end())
{
return pairFound->second;
}
//si no carga la fuente la regresamos
else
{
//Creamos el elemento del map de la fuente
auto &fuente = mapFuente[nombreArchivo];
fuente.loadFromFile(nombreArchivo);
return fuente;
}
}
Main.cpp
#include "ManejadorAssets.h"
int main()
{
//Creo mi ventana
sf::RenderWindow window(sf::VideoMode(640 , 480), "Manejador de Assets 3.0, Agregando Fuentes");
window.setFramerateLimit(60);
//Creo un objeto de mi manejador de assets
ManejadorAssets assets;
//Agregamos la fuente
sf::Text texto("Apoya al sitio dando clic en la publicidad", ManejadorAssets::obtenerFuente("Sansation.ttf"));
//GameLoop
while (window.isOpen())
{
window.clear();
//muestro mi texto
window.draw(texto);
//Eventos
sf::Event event;
//Se manejan los eventos
while (window.pollEvent(event))
{
//Creo una sentencia switch para controlar muchos eventos
switch (event.type)
{
//Cierra la ventana
case sf :: Event::EventType::Closed:
window.close();
break;
default:
break;
}
}
window.display();
}
return 0;
}
No hay comentarios:
Publicar un comentario