#include "spritecontainer.h" #include "classicsprite.h" #include #include static constexpr std::size_t RESERVED_SIZE = 20; SpriteContainer::SpriteContainer() { for (auto kind_of_action : {Action::PRESS_UP, Action::PRESS_DOWN, Action::PRESS_LEFT, Action::PRESS_RIGHT}) { reallocatePoll(kind_of_action); } std::cout << "Sprite poll reallocated.\n"; _font.loadFromFile("VeraMono.ttf"); } void SpriteContainer::reallocatePoll(Action kind_of_action) { SpritePoll &poll = _sprite_dispatcher[kind_of_action]; for (std::size_t i = 0; i < RESERVED_SIZE; ++i) { poll.push(createSprite(kind_of_action)); } } std::shared_ptr SpriteContainer::createSprite(Action kind_of_action) const { sf::RectangleShape sprite; sprite.setSize({20.f, 20.f}); switch (kind_of_action) { case Action::PRESS_UP: sprite.setFillColor(sf::Color(255, 0, 0)); break; case Action::PRESS_DOWN: sprite.setFillColor(sf::Color(0, 255, 0)); break; case Action::PRESS_LEFT: sprite.setFillColor(sf::Color(0, 0, 255)); break; case Action::PRESS_RIGHT: sprite.setFillColor(sf::Color(255, 0, 255)); break; default: // yellow sprite.setFillColor(sf::Color(255, 239, 0)); } return std::make_shared(sprite, _font); } std::shared_ptr SpriteContainer::getSprite(Action action) { SpritePoll& poll = _sprite_dispatcher.at(action); if (poll.empty()) reallocatePoll(action); std::shared_ptr sprite = poll.top(); poll.pop(); std::cout << "Taking a sprite from poll.\n"; return sprite; } void SpriteContainer::resetSprite(const std::shared_ptr &sprite, Action action) { _sprite_dispatcher[action].push(sprite); std::cout << "Returning a sprite to poll.\n"; }