Skip to content

Instantly share code, notes, and snippets.

@MrPlow442
Last active December 13, 2015 23:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MrPlow442/4996088 to your computer and use it in GitHub Desktop.
Save MrPlow442/4996088 to your computer and use it in GitHub Desktop.
/*
*Note: The brittle sprite clip and the non-descriptive SpriteId enum are temporary for the sake of this test
* I have an idea of making a .dat file that will hold the textures along with the clip data
*/
#include <SFML/Graphics.hpp>
#include <windows.h>
#include <iostream>
#include <vector>
#include <memory>
#include <map>
enum SpriteId
{
ITEM1,
ITEM2,
ITEM3,
ITEM4,
ITEM5
};
const int WIDTH = 100;
const int HEIGHT = 100;
class ActualSprite;
typedef std::tr1::shared_ptr< ActualSprite > SpriteSPtr;
typedef std::tr1::weak_ptr< ActualSprite > SpriteWPtr;
typedef std::map< SpriteId, SpriteWPtr > SpriteMap;
class ActualSprite : public sf::Sprite
{
private:
SpriteMap &mOwnerMap;
SpriteId &mName;
public:
ActualSprite(SpriteMap &ownerMap, SpriteId &name) : mOwnerMap(ownerMap), mName(name)
{}
~ActualSprite()
{
//DEBUG: checking if weak_ptr works as intended
std::cout << "I'm getting called" << std::endl;
//END DEBUG
mOwnerMap.erase(mName);
}
};
class SpriteManager
{
private:
SpriteMap spriteMap;
sf::Texture& mTexture;
void clipSprite(SpriteId name, SpriteSPtr sprite)
{
sprite->setTexture(mTexture);
switch(name)
{
case ITEM1: sprite->setTextureRect(sf::IntRect(0,0,WIDTH,HEIGHT));break;
case ITEM2: sprite->setTextureRect(sf::IntRect((1*WIDTH),0,WIDTH,HEIGHT));break;
case ITEM3: sprite->setTextureRect(sf::IntRect((2*WIDTH),0,WIDTH,HEIGHT));break;
case ITEM4: sprite->setTextureRect(sf::IntRect((3*WIDTH),0,WIDTH,HEIGHT));break;
case ITEM5: sprite->setTextureRect(sf::IntRect((4*WIDTH),0,WIDTH,HEIGHT));break;
default:
MessageBox(NULL, "The spriteId doesn't match", "Error", MB_ICONSTOP|MB_SETFOREGROUND);
exit(EXIT_FAILURE);
}
}
public:
SpriteManager(sf::Texture& texture) : mTexture(texture)
{}
~SpriteManager()
{
while(!spriteMap.empty())
{
SpriteWPtr sprite = spriteMap.begin()->second;
if(!sprite.expired())
{
if(!sprite.lock().unique())
{
MessageBox(NULL, "The sprite still exists somewhere and wasn't cleaned up properly.", "Error", MB_ICONSTOP|MB_SETFOREGROUND);
}
}
sprite.reset();
}
}
SpriteSPtr getSprite(SpriteId name)
{
SpriteSPtr& spriteSPtr = spriteMap[name].lock();
if(!spriteSPtr)
{
spriteSPtr = std::tr1::make_shared< ActualSprite >(spriteMap, name);
clipSprite(name, spriteSPtr);
spriteMap[name] = spriteSPtr;
return spriteSPtr;
}
else
return spriteSPtr;
}
};
void drawAll(sf::RenderWindow &window, std::vector< SpriteSPtr > &spriteList)
{
for(int i = 0; i < spriteList.size(); i++)
{
window.draw(*(spriteList.at(i)));
}
}
int main()
{
sf::RenderWindow window(sf::VideoMode(800,600), "Test", sf::Style::Titlebar | sf::Style::Close);
sf::RectangleShape background(sf::Vector2f(800.0f,600.0f));
window.setFramerateLimit(30);
sf::Texture spriteSheet;
if(!spriteSheet.loadFromFile("SpriteSheet.png"))
{
return 1;
}
SpriteManager sprites(spriteSheet);
std::vector< SpriteSPtr > spriteList;
spriteList.push_back(sprites.getSprite(ITEM2));
spriteList.push_back(sprites.getSprite(ITEM3));
spriteList.at(1)->setPosition(200.0f, 100.0f);
spriteList.push_back(sprites.getSprite(ITEM2));
spriteList.at(2)->setPosition(300.0f, 100.0f);
while(window.isOpen())
{
sf::Event event;
while( window.pollEvent(event))
{
if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
if(!spriteList.empty())
{
spriteList.pop_back();
}
}
if(event.type == sf::Event::Closed)
{
window.close();
}
}
window.clear();
window.draw(background);
drawAll(window,spriteList);
window.display();
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment