forked from NaiJi/project-kyoku
Implement generic SpriteContainer
parent
106697f6af
commit
cbe0fbb673
@ -0,0 +1,58 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <stack>
|
||||
#include <map>
|
||||
|
||||
template<typename Type, class SpriteFactory, class Sprite,
|
||||
typename = std::enable_if_t<std::is_enum<Type>::value>>
|
||||
class SpriteContainer
|
||||
{
|
||||
public:
|
||||
explicit SpriteContainer(std::initializer_list<Type>&& types,
|
||||
std::unique_ptr<SpriteFactory>&& factory,
|
||||
std::size_t reserve_size = 20) :
|
||||
_sprite_factory(std::move(factory)),
|
||||
_poll_reserve_size(reserve_size)
|
||||
{
|
||||
for (const Type& type : types)
|
||||
reallocatePoll(type);
|
||||
}
|
||||
|
||||
inline std::shared_ptr<Sprite> getSprite(Type type)
|
||||
{
|
||||
SpritePoll& poll = _sprite_dispatcher.at(type);
|
||||
|
||||
if (poll.empty())
|
||||
reallocatePoll(type);
|
||||
|
||||
std::shared_ptr<Sprite> sprite = poll.top();
|
||||
poll.pop();
|
||||
|
||||
return sprite;
|
||||
}
|
||||
|
||||
inline void resetSprite(const std::shared_ptr<Sprite> &sprite, Type action) noexcept
|
||||
{
|
||||
_sprite_dispatcher[action].push(sprite);
|
||||
}
|
||||
|
||||
~SpriteContainer(){}
|
||||
|
||||
private:
|
||||
inline void reallocatePoll(Type sprite_type)
|
||||
{
|
||||
SpritePoll &poll = _sprite_dispatcher[sprite_type];
|
||||
for (std::size_t i = 0; i < _poll_reserve_size; ++i)
|
||||
{
|
||||
poll.push(_sprite_factory->create(sprite_type));
|
||||
}
|
||||
}
|
||||
|
||||
using SpritePoll = std::stack<std::shared_ptr<Sprite>>;
|
||||
|
||||
std::map<Type, SpritePoll> _sprite_dispatcher;
|
||||
std::unique_ptr<SpriteFactory> _sprite_factory;
|
||||
|
||||
std::size_t _poll_reserve_size;
|
||||
};
|
@ -0,0 +1,19 @@
|
||||
#include "classicgraphicsmanager.h"
|
||||
#include "classicnote.h"
|
||||
|
||||
ClassicGraphicsManager::ClassicGraphicsManager() :
|
||||
_sprite_container({Action::PRESS_UP, Action::PRESS_DOWN,
|
||||
Action::PRESS_LEFT, Action::PRESS_RIGHT},
|
||||
std::make_unique<ClassicSpriteFactory>("VeraMono.ttf"))
|
||||
{}
|
||||
|
||||
void ClassicGraphicsManager::initSprite(ClassicNote* note)
|
||||
{
|
||||
const auto action_type = note->action();
|
||||
note->setSprite(_sprite_container.getSprite(action_type));
|
||||
}
|
||||
|
||||
void ClassicGraphicsManager::resetSprite(ClassicNote* note)
|
||||
{
|
||||
_sprite_container.resetSprite(note->sprite(), note->action());
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
#include "classicactions.h"
|
||||
#include "spritecontainer.h"
|
||||
#include "classicspritefactory.h"
|
||||
|
||||
class ClassicSprite;
|
||||
class ClassicNote;
|
||||
|
||||
class ClassicGraphicsManager
|
||||
{
|
||||
public:
|
||||
explicit ClassicGraphicsManager();
|
||||
|
||||
void initSprite(ClassicNote* note);
|
||||
void resetSprite(ClassicNote* note);
|
||||
|
||||
private:
|
||||
SpriteContainer<Action, ClassicSpriteFactory, ClassicSprite> _sprite_container;
|
||||
};
|
@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include "classicinputtype.h"
|
||||
#include "classicsprite.h"
|
||||
|
||||
class ClassicSpriteFactory
|
||||
{
|
||||
public:
|
||||
inline ClassicSpriteFactory(const std::string& font_filename)
|
||||
{
|
||||
_font.loadFromFile(font_filename);
|
||||
}
|
||||
|
||||
inline std::shared_ptr<ClassicSprite> create(Action action)
|
||||
{
|
||||
sf::RectangleShape sprite;
|
||||
sprite.setSize({20.f, 20.f});
|
||||
switch (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<ClassicSprite>(sprite, _font);
|
||||
}
|
||||
|
||||
private:
|
||||
sf::Font _font;
|
||||
};
|
||||
|
@ -1,78 +0,0 @@
|
||||
#include "spritecontainer.h"
|
||||
#include "classicsprite.h"
|
||||
|
||||
#include <SFML/Graphics/RectangleShape.hpp>
|
||||
#include <iostream>
|
||||
|
||||
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<ClassicSprite> 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<ClassicSprite>(sprite, _font);
|
||||
}
|
||||
|
||||
std::shared_ptr<ClassicSprite> SpriteContainer::getSprite(Action action)
|
||||
{
|
||||
SpritePoll& poll = _sprite_dispatcher.at(action);
|
||||
|
||||
if (poll.empty())
|
||||
reallocatePoll(action);
|
||||
|
||||
std::shared_ptr<ClassicSprite> sprite = poll.top();
|
||||
poll.pop();
|
||||
std::cout << "Taking a sprite from poll.\n";
|
||||
|
||||
return sprite;
|
||||
}
|
||||
|
||||
void SpriteContainer::resetSprite(const std::shared_ptr<ClassicSprite> &sprite, Action action)
|
||||
{
|
||||
_sprite_dispatcher[action].push(sprite);
|
||||
std::cout << "Returning a sprite to poll.\n";
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "classicactions.h"
|
||||
|
||||
#include <memory>
|
||||
#include <stack>
|
||||
|
||||
#include <SFML/Graphics/Font.hpp>
|
||||
|
||||
class ClassicSprite;
|
||||
class ClassicNote;
|
||||
|
||||
/* Move Sprite initialization into factory
|
||||
* and make this class template */
|
||||
|
||||
class SpriteContainer
|
||||
{
|
||||
public:
|
||||
explicit SpriteContainer();
|
||||
|
||||
std::shared_ptr<ClassicSprite> getSprite(Action action);
|
||||
void resetSprite(const std::shared_ptr<ClassicSprite> &sprite, Action action);
|
||||
|
||||
private:
|
||||
void reallocatePoll(Action kind_of_action);
|
||||
std::shared_ptr<ClassicSprite> createSprite(Action kind_of_action) const;
|
||||
|
||||
using SpritePoll = std::stack<std::shared_ptr<ClassicSprite>>;
|
||||
std::map<Action, SpritePoll> _sprite_dispatcher;
|
||||
sf::Font _font;
|
||||
};
|
Loading…
Reference in New Issue