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.
project-kyoku/src/classicgame/classicviewmanager.cpp

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";
}