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