forked from NaiJi/project-kyoku
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.9 KiB
C++
75 lines
1.9 KiB
C++
#include "classicviewmanager.h"
|
|
#include "classicsprite.h"
|
|
#include "classicnote.h"
|
|
#include <SFML/Graphics/RectangleShape.hpp>
|
|
#include <iostream>
|
|
|
|
static constexpr std::size_t RESERVED_SIZE = 20;
|
|
|
|
ClassicViewManager::ClassicViewManager()
|
|
{
|
|
for (auto kind_of_action : {Action::PRESS_UP, Action::PRESS_DOWN,
|
|
Action::PRESS_LEFT, Action::PRESS_RIGHT})
|
|
{
|
|
reallocatePoll(kind_of_action);
|
|
}
|
|
}
|
|
|
|
void ClassicViewManager::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> ClassicViewManager::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);
|
|
}
|
|
|
|
void ClassicViewManager::initNoteSprite(ClassicNote* note)
|
|
{
|
|
const auto action_type = note->action();
|
|
SpritePoll& poll = _sprite_dispatcher.at(action_type);
|
|
|
|
if (poll.empty())
|
|
reallocatePoll(action_type);
|
|
|
|
note->setSprite(poll.top());
|
|
poll.pop();
|
|
std::cout << "Taking a sprite from poll.\n";
|
|
}
|
|
|
|
void ClassicViewManager::resetNoteSprite(ClassicNote* note)
|
|
{
|
|
_sprite_dispatcher[note->action()].push(note->sprite());
|
|
note->setSprite(nullptr);
|
|
std::cout << "Returning a sprite to poll.\n";
|
|
}
|