Last active
December 13, 2015 23:59
-
-
Save MrPlow442/4996088 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
*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