martes, 9 de septiembre de 2014

SpriteManager

Un sencillo Sprite Manager. Considera todos los Sprites de igual tamaño.



viernes, 5 de septiembre de 2014

C++ y SFML, manejador de texturas (parte 2)

Una complementación sencilla.

#include "TextureManager.h"

TextureManager* TextureManager::instance = NULL;

TextureManager::TextureManager()
{
 //nada
}

TextureManager* TextureManager::GetInstance ()
{
 if (instance == NULL)  // ¿Es la primera llamada?
 {
  instance = new TextureManager; // Creamos la instancia
 }
 return instance; // Retornamos la dirección de la instancia
}


const sf::Texture &TextureManager::GetTexture(string filename){
 // buscamos la textura pedida
 map<string, sf::Texture>::iterator p;
 p=textures.find(filename);
 // si no la encontramos
 if(p==textures.end()){
  // la cargamos desde el archivo
  sf::Texture textureTemp;
  textureTemp.loadFromFile(filename);
  // y la insertamos en el mapa
  pair< map<string, sf::Texture>::iterator, bool > q;
  q=textures.insert(pair<string, sf::Texture>(filename, textureTemp));
  // hacemos que p apunte a la imagen insertada
  p=q.first;
 }
 // devolvemos la imagen
 return p->second;
}

unsigned TextureManager::Size(){
 // ¿Cuantas texturas tengo?
 return textures.size();
}


Así se usa
TextureManager * tm = TextureManager::GetInstance();
sf::Sprite box1; 
box1.setTexture( tm->GetTexture("box_sprites.png") );

C++ y SFML, manejador de texturas (parte 1)

Las texturas son recursos que ocupan gran cantidad de memoria y cuya carga y copia
son operaciones costosas. Un error es tener una instancia de textura por cada sprite.

Para administrar las texturas se propone la clase TextureManager.
Es Singleton, para que sólo exista un administrador.

Las texturas se guardan en un map que contiene el path a la textura, y la textura misma.

 
#ifndef TEXTUREMANAGER_H
#define TEXTUREMANAGER_H

#include <iostream>
#include <map> #include <SFML/Graphics.hpp>
using namespace std;

class TextureManager {

private:
  TextureManager();
  TextureManager(const TextureManager & );
  TextureManager &operator= (const TextureManager & );
 
  static TextureManager* instance;
  map<string, sf::Texture> textures;
 
public:
  static TextureManager* GetInstance();
  const sf::Texture &GetTexture(string filename);
  unsigned Size();
};

#endif