Iterative refactoring of what's done to this moment
This commit is contained in:
		
							parent
							
								
									ad1b31c95c
								
							
						
					
					
						commit
						106697f6af
					
				| @ -4,4 +4,5 @@ class Sprite | ||||
| { | ||||
| public: | ||||
|     virtual ~Sprite() = default; | ||||
|     virtual void reset() = 0; | ||||
| }; | ||||
|  | ||||
| @ -1,12 +0,0 @@ | ||||
| #ifndef TIMELINEVIEWMANAGER_H | ||||
| #define TIMELINEVIEWMANAGER_H | ||||
| 
 | ||||
| class Note; | ||||
| 
 | ||||
| class TimelineViewManager | ||||
| { | ||||
| public: | ||||
|     virtual ~TimelineViewManager() = default; | ||||
| }; | ||||
| 
 | ||||
| #endif // TIMELINEVIEWMANAGER_H
 | ||||
| @ -44,10 +44,16 @@ void Application::input() | ||||
|     sf::Event event; | ||||
|     while (_game_window.pollEvent(event)) | ||||
|     { | ||||
|         if (event.type == sf::Event::Closed) | ||||
|         switch(event.type) | ||||
|         { | ||||
|         case sf::Event::Closed: | ||||
|             _game_window.close(); | ||||
|             break; | ||||
| 
 | ||||
|         _game->input(event); | ||||
|         default: | ||||
|             _game->input(event); | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,12 +1,11 @@ | ||||
| #include "classicgame.h" | ||||
| #include "classicinputtype.h" | ||||
| #include "classictimeline.h" | ||||
| #include "classicviewmanager.h" | ||||
| #include "spritecontainer.h" | ||||
| #include "classicnote.h" | ||||
| 
 | ||||
| ClassicGame::ClassicGame() : | ||||
|     _timeline(std::make_unique<ClassicTimeline>()), | ||||
|     _view_manager(std::make_unique<ClassicViewManager>()) | ||||
|     _timeline(std::make_unique<ClassicTimeline>()) | ||||
| { | ||||
|     _keys_to_buttons = | ||||
|     { | ||||
| @ -52,7 +51,7 @@ ClassicGame::~ClassicGame() | ||||
| 
 | ||||
| void ClassicGame::run() | ||||
| { | ||||
|     _timeline->fetchVisibleNotes(_view_manager); | ||||
|     _timeline->fetchVisibleNotes(_sprite_container); | ||||
|     _timeline->run(); | ||||
| } | ||||
| 
 | ||||
| @ -82,7 +81,7 @@ void ClassicGame::input(const sf::Event& event) | ||||
| 
 | ||||
|     auto note = _timeline->getActiveNote(); | ||||
| 
 | ||||
|     if (!_timeline->isExpired(note) && (*note)->state() == ClassicNote::State::FLYING) | ||||
|     if (!_timeline->isExpired(note)) | ||||
|     { | ||||
|         (*note)->input(ClassicInputType(timestamp, new_action)); | ||||
|     } | ||||
| @ -101,7 +100,7 @@ Action ClassicGame::getActionKeyReleased(Button button) const | ||||
| void ClassicGame::update() | ||||
| { | ||||
|     _timeline->update(); | ||||
|     _timeline->fetchVisibleNotes(_view_manager); | ||||
|     _timeline->fetchVisibleNotes(_sprite_container); | ||||
| } | ||||
| 
 | ||||
| void ClassicGame::draw(sf::RenderWindow& window) const | ||||
|  | ||||
| @ -5,9 +5,9 @@ | ||||
| #include <list> | ||||
| #include "game.h" | ||||
| #include "classicactions.h" | ||||
| #include "spritecontainer.h" | ||||
| 
 | ||||
| class ClassicTimeline; | ||||
| class ClassicViewManager; | ||||
| 
 | ||||
| class ClassicGame final : public Game | ||||
| { | ||||
| @ -30,7 +30,7 @@ private: | ||||
|     Action getActionKeyReleased(Button button) const; | ||||
| 
 | ||||
|     std::unique_ptr<ClassicTimeline> _timeline; | ||||
|     std::unique_ptr<ClassicViewManager> _view_manager; | ||||
|     SpriteContainer _sprite_container; | ||||
| }; | ||||
| 
 | ||||
| #endif // CLASSICGAME_H
 | ||||
|  | ||||
| @ -9,6 +9,7 @@ ClassicNote::ClassicNote(const std::vector<microsec>& intervals, microsec perfec | ||||
|     _coordinates(coord), | ||||
|     _evaluator(intervals, _perfect_offset), | ||||
|     _action(action), | ||||
|     _state(State::NONE), | ||||
|     _appearance_time(0) | ||||
| {} | ||||
| 
 | ||||
| @ -26,19 +27,31 @@ static int getPt( int n1 , int n2 , float perc ) | ||||
| 
 | ||||
| void ClassicNote::update(const microsec& music_offset) | ||||
| { | ||||
|     auto update_time = music_offset - _appearance_time; | ||||
|     auto i = update_time / _trail_path_percent / 100; | ||||
| 
 | ||||
|     int xa = getPt( 720./2. , 1280./2. , i ); | ||||
|     int ya = getPt( 0 , 720./2. , i ); | ||||
|     int xb = getPt( 1280./2. , _coordinates.x , i ); | ||||
|     int yb = getPt( 720./2. , _coordinates.y , i ); | ||||
| 
 | ||||
|     _sprite->update(getPt( xa , xb , i ), getPt( ya , yb , i )); | ||||
| 
 | ||||
|     if (_state == State::DYING) | ||||
|     switch (_state)   // States will be objects
 | ||||
|     { | ||||
|     case State::DYING: | ||||
|         _sprite->update(); | ||||
|         if (_sprite->isDead()) | ||||
|             _state = State::DEAD; | ||||
|             setState(State::DEAD); | ||||
|         break; | ||||
| 
 | ||||
|     case State::FLYING: | ||||
|     { | ||||
|         auto update_time = music_offset - _appearance_time;   // This all will be inside ::update
 | ||||
|         auto i = update_time / _trail_path_percent / 100;      //         of an animation object
 | ||||
| 
 | ||||
|         int xa = getPt( 720./2. , 1280./2. , i ); | ||||
|         int ya = getPt( 0 , 720./2. , i ); | ||||
|         int xb = getPt( 1280./2. , _coordinates.x , i ); | ||||
|         int yb = getPt( 720./2. , _coordinates.y , i ); | ||||
| 
 | ||||
|         _sprite->update(getPt( xa , xb , i ), getPt( ya , yb , i )); | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void ClassicNote::draw(sf::RenderTarget& target, sf::RenderStates states) const | ||||
| @ -51,13 +64,12 @@ auto ClassicNote::input(ClassicInputType&& input_data) -> Grade | ||||
|     auto grade = ClassicNote::Grade::BAD; | ||||
| 
 | ||||
|     if (input_data == _action) | ||||
|     { | ||||
|         grade = _evaluator.calculatePrecision(input_data.timestamp()); | ||||
|     } | ||||
| 
 | ||||
|     setState(State::DYING); | ||||
| 
 | ||||
|     std::cout << "User input: " << static_cast<int>(grade) << "\n"; | ||||
|     _state = State::DYING; | ||||
|     _sprite->showGrade(); | ||||
| 
 | ||||
|     return grade; | ||||
| } | ||||
| 
 | ||||
| @ -73,6 +85,24 @@ auto ClassicNote::state() const -> State | ||||
| 
 | ||||
| void ClassicNote::setState(State next_state) | ||||
| { | ||||
|     switch (next_state)   // States will be objects
 | ||||
|     { | ||||
|     case State::DYING: | ||||
|         _sprite->pulse(); | ||||
|         break; | ||||
| 
 | ||||
|     case State::FLYING: | ||||
|         _sprite->setCoordinates(_coordinates.x, _coordinates.y, 720/2, 50); | ||||
|         break; | ||||
| 
 | ||||
|     case State::NONE: | ||||
|         _sprite->reset(); | ||||
|         break; | ||||
| 
 | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     _state = next_state; | ||||
| } | ||||
| 
 | ||||
| @ -91,7 +121,7 @@ void ClassicNote::setSprite(const std::shared_ptr<ClassicSprite>& sprite) noexce | ||||
| { | ||||
|     _sprite = sprite; | ||||
|     if (_sprite) | ||||
|         _sprite->setCoordinates(_coordinates.x, _coordinates.y, 720/2, 50); | ||||
|         setState(State::FLYING); | ||||
| } | ||||
| 
 | ||||
| const Coordinates& ClassicNote::getCoordinates() const noexcept | ||||
|  | ||||
| @ -32,6 +32,8 @@ public: | ||||
| 
 | ||||
|     enum class State | ||||
|     { | ||||
|           NONE, | ||||
| 
 | ||||
|         FLYING, | ||||
|          DYING, | ||||
|           DEAD | ||||
| @ -60,7 +62,7 @@ private: | ||||
|     const Coordinates _coordinates; | ||||
|     const PrecisionEvaluator<Grade> _evaluator; | ||||
|     const Action _action; | ||||
|     State _state = State::FLYING; | ||||
|     State _state; | ||||
| 
 | ||||
|     std::shared_ptr<ClassicSprite> _sprite; | ||||
|     microsec _appearance_time; | ||||
|  | ||||
| @ -16,6 +16,14 @@ void ClassicSprite::draw(sf::RenderTarget& target, sf::RenderStates states) cons | ||||
|     target.draw(_grade_text, states); | ||||
| } | ||||
| 
 | ||||
| void ClassicSprite::reset() | ||||
| { | ||||
|     _shape.setPosition(0, 0); | ||||
|     _trail.setPosition(0, 0); | ||||
|     _grade_text.setPosition(0, 0); | ||||
|     _grade_text.setFillColor(sf::Color(255, 255, 255, 0)); | ||||
| } | ||||
| 
 | ||||
| void ClassicSprite::setCoordinates(float x, float y, float trail_x, float trail_y) noexcept | ||||
| { | ||||
|     _shape.setPosition(x, y); | ||||
| @ -26,12 +34,17 @@ void ClassicSprite::setCoordinates(float x, float y, float trail_x, float trail_ | ||||
| void ClassicSprite::update(float trail_x, float trail_y) noexcept | ||||
| { | ||||
|     _trail.setPosition(trail_x, trail_y); | ||||
| } | ||||
| 
 | ||||
| void ClassicSprite::update() noexcept | ||||
| { | ||||
|     fade(); | ||||
| } | ||||
| 
 | ||||
| void ClassicSprite::showGrade() | ||||
| void ClassicSprite::pulse() | ||||
| { | ||||
|     _grade_text.setFillColor(sf::Color(255, 255, 255, 255)); | ||||
|     _shape.setFillColor(sf::Color(140, 140, 140)); | ||||
| } | ||||
| 
 | ||||
| void ClassicSprite::fade() | ||||
| @ -41,13 +54,24 @@ void ClassicSprite::fade() | ||||
|     if (fill_color.a == 0) | ||||
|         return; | ||||
| 
 | ||||
|     const auto new_alpha = fill_color.a - 55; | ||||
|     auto new_alpha = fill_color.a - 55; | ||||
|     fill_color.a = new_alpha < 0 ? 0 : new_alpha; | ||||
| 
 | ||||
|     _grade_text.setFillColor(fill_color); | ||||
| 
 | ||||
|     fill_color = _shape.getFillColor(); | ||||
| 
 | ||||
|     if (fill_color.a == 0) | ||||
|         return; | ||||
| 
 | ||||
|     new_alpha = fill_color.a - 55; | ||||
|     fill_color.a = new_alpha < 0 ? 0 : new_alpha; | ||||
| 
 | ||||
|     _shape.setFillColor(fill_color); | ||||
| } | ||||
| 
 | ||||
| bool ClassicSprite::isDead() const | ||||
| { | ||||
|     return _grade_text.getFillColor().a == 0; | ||||
|     return _grade_text.getFillColor().a == 0 | ||||
|         ||      _shape.getFillColor().a == 0; | ||||
| } | ||||
|  | ||||
| @ -9,10 +9,13 @@ class ClassicSprite : public Sprite, public sf::Drawable | ||||
| public: | ||||
|     ClassicSprite(const sf::RectangleShape& shape, const sf::Font &font); | ||||
|     virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override; | ||||
|     virtual void reset() override; | ||||
| 
 | ||||
|     void setCoordinates(float x, float y, float trail_x, float trail_y) noexcept; | ||||
|     void update(float trail_x, float trail_y) noexcept; | ||||
|     void showGrade(); | ||||
|     void update() noexcept; | ||||
| 
 | ||||
|     void pulse(); | ||||
|     void fade(); | ||||
|     bool isDead() const; | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,8 @@ | ||||
| #include "classicactions.h" | ||||
| #include "classictimeline.h" | ||||
| #include "classicnote.h" | ||||
| #include "classicviewmanager.h" | ||||
| #include "spritecontainer.h" | ||||
| 
 | ||||
| #include <SFML/Graphics/RenderTarget.hpp> | ||||
| 
 | ||||
| ClassicTimeline::ClassicTimeline() | ||||
| @ -44,6 +45,7 @@ ClassicTimeline::ClassicTimeline() | ||||
|         x += 70; | ||||
|     } | ||||
| 
 | ||||
|     expire(_first_visible_note); | ||||
|     expire(_last_visible_note); | ||||
|     expire(_active_note); | ||||
|     _top_note = _timeline.begin(); | ||||
| @ -65,9 +67,6 @@ void ClassicTimeline::clear() | ||||
|         delete note; | ||||
| 
 | ||||
|     _timeline.clear(); | ||||
|     expire(_top_note); | ||||
|     expire(_last_visible_note); | ||||
|     expire(_active_note); | ||||
| } | ||||
| 
 | ||||
| void ClassicTimeline::update() | ||||
| @ -79,8 +78,12 @@ void ClassicTimeline::update() | ||||
| 
 | ||||
| void ClassicTimeline::checkCurrentActiveNote(const microsec &music_offset) | ||||
| { | ||||
|     if (!isExpired(_active_note) | ||||
|     && ((!(*_active_note)->isActive(music_offset)) || (*_active_note)->state() == ClassicNote::State::DEAD)) | ||||
|     if (isExpired(_active_note)) | ||||
|         return; | ||||
| 
 | ||||
|     auto note = *_active_note; | ||||
| 
 | ||||
|     if (!note->isActive(music_offset)) | ||||
|     { | ||||
|         expire(_active_note); | ||||
|         ++_top_note; | ||||
| @ -89,16 +92,16 @@ void ClassicTimeline::checkCurrentActiveNote(const microsec &music_offset) | ||||
| 
 | ||||
| void ClassicTimeline::checkForNextActiveNote(const microsec &music_offset) | ||||
| { | ||||
|     if (isExpired(_active_note) && (*_top_note)->isActive(music_offset)) | ||||
|     { | ||||
|         std::cout << "New active note: " << music_offset << '\n'; | ||||
|     if (!isExpired(_active_note)) | ||||
|         return; | ||||
| 
 | ||||
|     auto top_note = *_top_note; | ||||
|     if (top_note->isActive(music_offset)) | ||||
|         _active_note = _top_note; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| ClassicTimeline::Iterator ClassicTimeline::getActiveNote() noexcept | ||||
| { | ||||
|     update(); | ||||
|     return _active_note; | ||||
| } | ||||
| 
 | ||||
| @ -117,68 +120,74 @@ microsec ClassicTimeline::currentMusicOffset() const | ||||
|     return _music.getPlayingOffset().asMicroseconds(); | ||||
| } | ||||
| 
 | ||||
| void ClassicTimeline::discardExpiredNotes(const std::unique_ptr<ClassicViewManager> &view_manager) | ||||
| { | ||||
|     if (_top_note == _timeline.begin()) | ||||
|         return; | ||||
| 
 | ||||
|     Iterator past_note = _top_note - 1; | ||||
|     std::shared_ptr<ClassicSprite> sprite = (*past_note)->sprite(); | ||||
|     while (sprite) | ||||
|     { | ||||
|         auto state = (*past_note)->state(); | ||||
|         if (state == ClassicNote::State::DEAD || state == ClassicNote::State::FLYING) | ||||
|             view_manager->resetNoteSprite(*past_note); | ||||
|         if (past_note == _timeline.begin()) | ||||
|             return; | ||||
|         --past_note; | ||||
|         sprite = (*past_note)->sprite(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool ClassicTimeline::isVisiblyClose(const Iterator &iterator, const microsec &music_offset) const | ||||
| { | ||||
|     return ((*iterator)->offset() - _visibility_offset) <= music_offset; | ||||
| } | ||||
| 
 | ||||
| void ClassicTimeline::fetchVisibleNotes(const std::unique_ptr<ClassicViewManager>& view_manager) | ||||
| void ClassicTimeline::fetchVisibleNotes(SpriteContainer& sprite_container) | ||||
| { | ||||
|     const microsec music_offset = currentMusicOffset(); | ||||
|     discardExpiredNotes(view_manager); | ||||
|     initGraphicsForNewNotes(sprite_container, music_offset); | ||||
|     discardGraphicsForDeadNotes(sprite_container); | ||||
| } | ||||
| 
 | ||||
| void ClassicTimeline::initGraphicsForNewNotes(SpriteContainer& sprite_container, const microsec &music_offset) | ||||
| { | ||||
|     Iterator note_iterator = _top_note; | ||||
|     while (isVisiblyClose(note_iterator, music_offset)) | ||||
|     { | ||||
|         ClassicNote* note = *note_iterator; | ||||
|         if (!note->sprite()) | ||||
|         { | ||||
|             note->saveAppearanceTime(music_offset); | ||||
|             view_manager->initNoteSprite(note); | ||||
|         } | ||||
|         if (nothingToDraw()) | ||||
|             _first_visible_note = note_iterator; | ||||
| 
 | ||||
|         if (note->state() == ClassicNote::State::DEAD) | ||||
|             view_manager->resetNoteSprite(note); | ||||
|         auto note = *note_iterator; | ||||
| 
 | ||||
|         note->update(music_offset); | ||||
|         ++note_iterator; | ||||
|         if (note->sprite()) | ||||
|             continue; | ||||
| 
 | ||||
|         note->saveAppearanceTime(music_offset); | ||||
| 
 | ||||
|         const auto action_type = note->action(); | ||||
|         const auto sprite = sprite_container.getSprite(action_type); | ||||
|         note->setSprite(sprite); | ||||
|     } | ||||
| 
 | ||||
|     _last_visible_note = note_iterator; | ||||
| } | ||||
| 
 | ||||
| void ClassicTimeline::drawVisibleNotes(sf::RenderWindow &window) const | ||||
| void ClassicTimeline::discardGraphicsForDeadNotes(SpriteContainer &sprite_container) | ||||
| { | ||||
|     bool no_visible_notes = isExpired(_last_visible_note) | ||||
|                          || _top_note > _last_visible_note; | ||||
| 
 | ||||
|     if (no_visible_notes) | ||||
|     if (nothingToDraw()) | ||||
|         return; | ||||
| 
 | ||||
|     Iterator note_to_draw = _top_note; | ||||
|     while (note_to_draw != (_last_visible_note)) | ||||
|     auto note_iterator = _first_visible_note; | ||||
|     while (note_iterator != _last_visible_note) | ||||
|     { | ||||
|         if ((*note_to_draw)->sprite()) | ||||
|             window.draw(*(*note_to_draw)); | ||||
|         ++note_to_draw; | ||||
|         auto note = *note_iterator; | ||||
|         if (note->state() == ClassicNote::State::DEAD) | ||||
|         { | ||||
|             note->setState(ClassicNote::State::NONE); | ||||
|             const auto action_type = note->action(); | ||||
|             sprite_container.resetSprite(note->sprite(), action_type); | ||||
|             note->setSprite(nullptr); | ||||
|             ++_first_visible_note; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool ClassicTimeline::nothingToDraw() const noexcept | ||||
| { | ||||
|     return isExpired(_first_visible_note); | ||||
| } | ||||
| 
 | ||||
| void ClassicTimeline::drawVisibleNotes(sf::RenderWindow &window) const | ||||
| { | ||||
|     if (nothingToDraw()) | ||||
|         return; | ||||
| 
 | ||||
|     std::for_each(_first_visible_note, _last_visible_note, | ||||
|                   [&window](const auto& note) | ||||
|                   { | ||||
|                       window.draw(*note); | ||||
|                   }); | ||||
| } | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
| #include <SFML/Audio/Music.hpp> | ||||
| 
 | ||||
| class ClassicNote; | ||||
| class ClassicViewManager; | ||||
| class SpriteContainer; | ||||
| 
 | ||||
| class ClassicTimeline : public Timeline | ||||
| { | ||||
| @ -20,7 +20,9 @@ public: | ||||
|     virtual microsec currentMusicOffset() const override; | ||||
|     virtual void drawVisibleNotes(sf::RenderWindow& window) const override; | ||||
| 
 | ||||
|     void fetchVisibleNotes(const std::unique_ptr<ClassicViewManager>& view_manager); | ||||
|     void fetchVisibleNotes(SpriteContainer& sprite_container); | ||||
|     void initGraphicsForNewNotes(SpriteContainer& sprite_container, const microsec& music_offset); | ||||
|     void discardGraphicsForDeadNotes(SpriteContainer& sprite_container); | ||||
| 
 | ||||
|     using Iterator = std::vector<ClassicNote*>::const_iterator; | ||||
| 
 | ||||
| @ -34,6 +36,7 @@ private: | ||||
|     Iterator _top_note; | ||||
|     Iterator _active_note; | ||||
|     Iterator _last_visible_note; | ||||
|     Iterator _first_visible_note; | ||||
| 
 | ||||
|     microsec _visibility_offset; | ||||
| 
 | ||||
| @ -41,8 +44,8 @@ private: | ||||
| 
 | ||||
|     void checkCurrentActiveNote(const microsec &music_offset); | ||||
|     void checkForNextActiveNote(const microsec &music_offset); | ||||
|     void discardExpiredNotes(const std::unique_ptr<ClassicViewManager>& view_manager); | ||||
|     bool isVisiblyClose(const Iterator& iterator, const microsec& music_offset) const; | ||||
|     bool nothingToDraw() const noexcept; | ||||
| 
 | ||||
|     /* Difference between top and active note is that
 | ||||
|      * top note is the note handling input right now | ||||
|  | ||||
| @ -1,12 +1,12 @@ | ||||
| #include "classicviewmanager.h" | ||||
| #include "spritecontainer.h" | ||||
| #include "classicsprite.h" | ||||
| #include "classicnote.h" | ||||
| 
 | ||||
| #include <SFML/Graphics/RectangleShape.hpp> | ||||
| #include <iostream> | ||||
| 
 | ||||
| static constexpr std::size_t RESERVED_SIZE = 20; | ||||
| 
 | ||||
| ClassicViewManager::ClassicViewManager() | ||||
| SpriteContainer::SpriteContainer() | ||||
| { | ||||
|     for (auto kind_of_action : {Action::PRESS_UP, Action::PRESS_DOWN, | ||||
|                                 Action::PRESS_LEFT, Action::PRESS_RIGHT}) | ||||
| @ -14,10 +14,12 @@ ClassicViewManager::ClassicViewManager() | ||||
|         reallocatePoll(kind_of_action); | ||||
|     } | ||||
| 
 | ||||
|     std::cout << "Sprite poll reallocated.\n"; | ||||
| 
 | ||||
|     _font.loadFromFile("VeraMono.ttf"); | ||||
| } | ||||
| 
 | ||||
| void ClassicViewManager::reallocatePoll(Action kind_of_action) | ||||
| void SpriteContainer::reallocatePoll(Action kind_of_action) | ||||
| { | ||||
|     SpritePoll &poll = _sprite_dispatcher[kind_of_action]; | ||||
|     for (std::size_t i = 0; i < RESERVED_SIZE; ++i) | ||||
| @ -26,7 +28,7 @@ void ClassicViewManager::reallocatePoll(Action kind_of_action) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| std::shared_ptr<ClassicSprite> ClassicViewManager::createSprite(Action kind_of_action) const | ||||
| std::shared_ptr<ClassicSprite> SpriteContainer::createSprite(Action kind_of_action) const | ||||
| { | ||||
|     sf::RectangleShape sprite; | ||||
|     sprite.setSize({20.f, 20.f}); | ||||
| @ -55,22 +57,22 @@ std::shared_ptr<ClassicSprite> ClassicViewManager::createSprite(Action kind_of_a | ||||
|     return std::make_shared<ClassicSprite>(sprite, _font); | ||||
| } | ||||
| 
 | ||||
| void ClassicViewManager::initNoteSprite(ClassicNote* note) | ||||
| std::shared_ptr<ClassicSprite> SpriteContainer::getSprite(Action action) | ||||
| { | ||||
|     const auto action_type = note->action(); | ||||
|     SpritePoll& poll = _sprite_dispatcher.at(action_type); | ||||
|     SpritePoll& poll = _sprite_dispatcher.at(action); | ||||
| 
 | ||||
|     if (poll.empty()) | ||||
|         reallocatePoll(action_type); | ||||
|         reallocatePoll(action); | ||||
| 
 | ||||
|     note->setSprite(poll.top()); | ||||
|     std::shared_ptr<ClassicSprite> sprite = poll.top(); | ||||
|     poll.pop(); | ||||
|     std::cout << "Taking a sprite from poll.\n"; | ||||
| 
 | ||||
|     return sprite; | ||||
| } | ||||
| 
 | ||||
| void ClassicViewManager::resetNoteSprite(ClassicNote* note) | ||||
| void SpriteContainer::resetSprite(const std::shared_ptr<ClassicSprite> &sprite, Action action) | ||||
| { | ||||
|     _sprite_dispatcher[note->action()].push(note->sprite()); | ||||
|     note->setSprite(nullptr); | ||||
|     _sprite_dispatcher[action].push(sprite); | ||||
|     std::cout << "Returning a sprite to poll.\n"; | ||||
| } | ||||
| @ -1,24 +1,25 @@ | ||||
| #ifndef CLASSICDIVAVIEWMANAGER_H | ||||
| #define CLASSICDIVAVIEWMANAGER_H | ||||
| #pragma once | ||||
| 
 | ||||
| #include "timelineviewmanager.h" | ||||
| #include "classicactions.h" | ||||
| 
 | ||||
| #include <memory> | ||||
| #include <stack> | ||||
| #include <map> | ||||
| 
 | ||||
| #include <SFML/Graphics/Font.hpp> | ||||
| 
 | ||||
| class ClassicSprite; | ||||
| class ClassicNote; | ||||
| 
 | ||||
| class ClassicViewManager : public TimelineViewManager | ||||
| /* Move Sprite initialization into factory
 | ||||
|  *          and make this class template   */ | ||||
| 
 | ||||
| class SpriteContainer | ||||
| { | ||||
| public: | ||||
|     explicit ClassicViewManager(); | ||||
|     explicit SpriteContainer(); | ||||
| 
 | ||||
|     void initNoteSprite(ClassicNote *note); | ||||
|     void resetNoteSprite(ClassicNote *note); | ||||
|     std::shared_ptr<ClassicSprite> getSprite(Action action); | ||||
|     void resetSprite(const std::shared_ptr<ClassicSprite> &sprite, Action action); | ||||
| 
 | ||||
| private: | ||||
|     void reallocatePoll(Action kind_of_action); | ||||
| @ -28,5 +29,3 @@ private: | ||||
|     std::map<Action, SpritePoll> _sprite_dispatcher; | ||||
|     sf::Font _font; | ||||
| }; | ||||
| 
 | ||||
| #endif // CLASSICDIVAVIEWMANAGER_H
 | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user