jueves, 14 de mayo de 2015

Manejador de Assets 2.0, Agregando Audio en SFML


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);

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;

 //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 lo regresamos
  else
  {
   //Creamos el elemento del map del sonido buffer
   auto &sonido = mapSonidoBuffer[nombreArchivo];
   sonido.loadFromFile(nombreArchivo);
   return sonido;
  }
}


Main.cpp

#include "ManejadorAssets.h"

int main()
{
 //Creo mi ventana
 sf::RenderWindow window(sf::VideoMode(640 , 480), "Manejador de Assets 2.0, Agregando Audio");
 window.setFramerateLimit(60);

 //Creo un objeto de mi manejador de assets
 ManejadorAssets assets;

 //Mando a llamar a mi sonido con mi Manejador de Assets
 sf::Sound sonido(ManejadorAssets::obtenerSonidoBuffer("sonido.ogg"));

 //Se reproduce una vez
 sonido.play();

 //GameLoop
 while (window.isOpen())
 {
  window.clear();

  //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