diff --git a/src/modes/classicmode/game/classicarrownote.cpp b/src/modes/classicmode/game/classicarrownote.cpp index 2a5ed7d..7e3549f 100644 --- a/src/modes/classicmode/game/classicarrownote.cpp +++ b/src/modes/classicmode/game/classicarrownote.cpp @@ -34,14 +34,9 @@ void ClassicArrowNote::input(kku::GameEvent&& input) _context->input(this, std::move(input)); } -void ClassicArrowNote::setGraphics(const std::shared_ptr& graphics_manager, kku::TimeRange&& range) const -{ - -} - void ClassicArrowNote::draw(const std::shared_ptr& graphics_manager) const { - graphics_manager->draw(this); + graphics_manager->draw(_elements); } bool ClassicArrowNote::isHold() const @@ -49,7 +44,7 @@ bool ClassicArrowNote::isHold() const return _is_holding; } -const std::vector& ClassicArrowNote::getElements() const +std::vector& ClassicArrowNote::getElements() { return _elements; } diff --git a/src/modes/classicmode/game/classicarrownote.h b/src/modes/classicmode/game/classicarrownote.h index a447fac..7b22954 100644 --- a/src/modes/classicmode/game/classicarrownote.h +++ b/src/modes/classicmode/game/classicarrownote.h @@ -35,11 +35,10 @@ public: virtual bool isActive(const kku::microsec& offset) const override; virtual void update(const kku::microsec &music_offset) override; virtual void input(kku::GameEvent&& input) override; - virtual void setGraphics(const std::shared_ptr& graphics_manager, kku::TimeRange&& range) const override; virtual void draw(const std::shared_ptr &graphics_manager) const override; bool isHold() const; - const std::vector& getElements() const; + std::vector& getElements(); Grade calculatePrecision(const kku::microsec& offset) const; bool isPressedAs(kku::SystemEvent::Key::Code key) const; diff --git a/src/modes/classicmode/game/classicgame.cpp b/src/modes/classicmode/game/classicgame.cpp index 1bc3508..8dcdc49 100644 --- a/src/modes/classicmode/game/classicgame.cpp +++ b/src/modes/classicmode/game/classicgame.cpp @@ -3,6 +3,7 @@ #include "classicmapcreator.h" #include "gamecontext.h" #include "holdmanager.h" +#include "graphics/classicgraphicsmanager.h" ClassicGame::ClassicGame(const std::shared_ptr>& timeline, const std::shared_ptr& context) : @@ -60,9 +61,10 @@ void ClassicGame::update(kku::UpdateData&& updatedata) }*/ _timeline->update(updatedata.timestamp); + _context->getGraphicsManager()->update(updatedata.timestamp); } void ClassicGame::display() const { - _context->display(); + _context->getGraphicsManager()->display(); } diff --git a/src/modes/classicmode/game/gamecontext.cpp b/src/modes/classicmode/game/gamecontext.cpp index b5e6f95..3800473 100644 --- a/src/modes/classicmode/game/gamecontext.cpp +++ b/src/modes/classicmode/game/gamecontext.cpp @@ -66,6 +66,11 @@ void GameContext::update(ClassicArrowNote *note, const kku::microsec& music_offs default: return; break; + case ClassicArrowNote::State::INITIAL: + note->setState(ClassicArrowNote::State::FLYING); + _graphics_manager->update(music_offset, note); + break; + case ClassicArrowNote::State::FLYING: if (!note->isActive(music_offset) && music_offset > note->getPerfectOffset()) { @@ -91,7 +96,7 @@ std::shared_ptr GameContext::getHoldManager() const return _hold_manager; } -void GameContext::display() const +std::shared_ptr GameContext::getGraphicsManager() const { - _graphics_manager->display(); + return _graphics_manager; } diff --git a/src/modes/classicmode/game/gamecontext.h b/src/modes/classicmode/game/gamecontext.h index 2606750..6a185db 100644 --- a/src/modes/classicmode/game/gamecontext.h +++ b/src/modes/classicmode/game/gamecontext.h @@ -14,9 +14,9 @@ public: virtual void input(ClassicArrowNote *note, kku::GameEvent&& input) const override; virtual void update(ClassicArrowNote *note, const kku::microsec &music_offset) const override; - virtual void display() const override; std::shared_ptr getHoldManager() const; + std::shared_ptr getGraphicsManager() const; private: const std::shared_ptr _hold_manager; diff --git a/src/modes/classicmode/graphics/classicgraphicsmanager.h b/src/modes/classicmode/graphics/classicgraphicsmanager.h index 279986b..f042a77 100644 --- a/src/modes/classicmode/graphics/classicgraphicsmanager.h +++ b/src/modes/classicmode/graphics/classicgraphicsmanager.h @@ -4,8 +4,10 @@ #include "core/gameevent.h" #include +#include class ClassicArrowNote; +class ArrowElement; // class ClassicSliderNote; class ClassicGraphicsManager : public std::enable_shared_from_this @@ -18,10 +20,12 @@ public: virtual void input(kku::GameEvent&& input) = 0; virtual void display() const = 0; + virtual void update(const kku::microsec& offset) = 0; + virtual void update(const kku::microsec& offset, ClassicArrowNote* note) = 0; // virtual void update(const kku::microsec& offset, ClassicSliderNote* note) = 0; - virtual void draw(const ClassicArrowNote* note) const = 0; + virtual void draw(const std::vector& elements) const = 0; // virtual void draw(ClassicSliderNote* note) const = 0; protected: diff --git a/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp b/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp index 3680d65..de13146 100644 --- a/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp +++ b/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp @@ -37,19 +37,23 @@ void ClassicSceneGraphicsManager::display() const } } -void ClassicSceneGraphicsManager::update(const kku::microsec& offset, ClassicArrowNote* note) +void ClassicSceneGraphicsManager::update(const kku::microsec &offset) { - //TODO - (void)note; fetchLastNote(offset); fetchFirstNote(offset); updateVisibleNotes(offset); } -void ClassicSceneGraphicsManager::draw(const ClassicArrowNote* note) const +void ClassicSceneGraphicsManager::update(const kku::microsec& offset, ClassicArrowNote* note) +{ + bool hasGraphics = (note->getElements()[0].sprite != nullptr); + if (isVisiblyClose(note, offset) && (!hasGraphics)) + setGraphics(note->getElements(), kku::TimeRange{note->getPerfectOffset() - _visibility_offset, note->getPerfectOffset()}); +} + +void ClassicSceneGraphicsManager::draw(const std::vector& elements) const { - auto& elements = note->getElements(); for (std::size_t i = 0; i < elements.size(); ++i) { const auto& sprite = elements[i].sprite; @@ -89,9 +93,9 @@ bool ClassicSceneGraphicsManager::nothingToDraw() const noexcept || _timeline->isExpired(_last); } -bool ClassicSceneGraphicsManager::isVisiblyClose(const Iterator& iterator, const kku::microsec& music_offset) const noexcept +bool ClassicSceneGraphicsManager::isVisiblyClose(const ClassicNote * const note, const kku::microsec& music_offset) const noexcept { - return ((*iterator)->getPerfectOffset() - _visibility_offset) <= music_offset; + return (note->getPerfectOffset() - _visibility_offset) <= music_offset; } void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset) @@ -102,7 +106,7 @@ void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset) if (offset < (*_first)->getPerfectOffset()) { Iterator note_iterator = _first; - while (note_iterator != _timeline->begin() && isVisiblyClose(note_iterator, offset)) + while (note_iterator != _timeline->begin() && isVisiblyClose(*note_iterator, offset)) { --note_iterator; } @@ -110,12 +114,13 @@ void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset) _first = note_iterator; auto note = *_first; - if (note->getState() != ClassicNote::State::FLYING - && note->getState() != ClassicNote::State::DYING + const auto state = note->getState(); + if (state != ClassicNote::State::FLYING + && state != ClassicNote::State::DYING + && state != ClassicNote::State::INITIAL && offset <= note->getPerfectOffset()) { - note->setState(ClassicNote::State::FLYING); - note->setGraphics(shared_from_this(), kku::TimeRange{note->getPerfectOffset() - _visibility_offset, note->getPerfectOffset()}); + note->setState(ClassicNote::State::INITIAL); } } else @@ -138,19 +143,19 @@ void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset) void ClassicSceneGraphicsManager::fetchLastNote(const kku::microsec& offset) { Iterator note_iterator = _timeline->getTopNote(); - while (!_timeline->isExpired(note_iterator) && isVisiblyClose(note_iterator, offset)) + while (!_timeline->isExpired(note_iterator) && isVisiblyClose(*note_iterator, offset)) { if (nothingToDraw()) _first = note_iterator; auto note = *note_iterator; - - if (note->getState() != ClassicNote::State::FLYING - && note->getState() != ClassicNote::State::DYING + const auto state = note->getState(); + if (state != ClassicNote::State::FLYING + && state != ClassicNote::State::DYING + && state != ClassicNote::State::INITIAL && offset <= note->getPerfectOffset()) { - note->setState(ClassicNote::State::FLYING); - note->setGraphics(shared_from_this(), kku::TimeRange{note->getPerfectOffset() - _visibility_offset, note->getPerfectOffset()}); + note->setState(ClassicNote::State::INITIAL); } ++note_iterator; diff --git a/src/modes/classicmode/graphics/classicscenegraphicsmanager.h b/src/modes/classicmode/graphics/classicscenegraphicsmanager.h index 69c84ad..35e2e7d 100644 --- a/src/modes/classicmode/graphics/classicscenegraphicsmanager.h +++ b/src/modes/classicmode/graphics/classicscenegraphicsmanager.h @@ -20,9 +20,10 @@ public: virtual void input(kku::GameEvent&& input) override; virtual void display() const override; + virtual void update(const kku::microsec& offset) override; virtual void update(const kku::microsec& offset, ClassicArrowNote* note) override; - virtual void draw(const ClassicArrowNote* note) const override; + virtual void draw(const std::vector& elements) const override; virtual void setGraphics(std::vector& elements, kku::TimeRange&& range); protected: @@ -37,7 +38,7 @@ protected: const std::shared_ptr> _timeline; inline bool nothingToDraw() const noexcept; - inline bool isVisiblyClose(const Iterator& iterator, const kku::microsec& music_offset) const noexcept; + inline bool isVisiblyClose(const ClassicNote * const note, const kku::microsec& music_offset) const noexcept; void fetchFirstNote(const kku::microsec& offset); void fetchLastNote(const kku::microsec& offset); void updateVisibleNotes(const kku::microsec& offset); diff --git a/src/modes/classicmode/include/classicmode/classicnote.h b/src/modes/classicmode/include/classicmode/classicnote.h index 37e2b81..33a1011 100644 --- a/src/modes/classicmode/include/classicmode/classicnote.h +++ b/src/modes/classicmode/include/classicmode/classicnote.h @@ -13,9 +13,10 @@ public: { NONE = 0, - FLYING = 1, - DYING = 2, - DEAD = 3 + INITIAL = 1, + FLYING = 2, + DYING = 3, + DEAD = 4 }; explicit ClassicNote(const kku::microsec& perfect_offset); @@ -24,8 +25,6 @@ public: virtual bool isActive(const kku::microsec& offset) const override = 0; virtual void update(const kku::microsec &music_offset) override = 0; virtual void input(kku::GameEvent&& input) override = 0; - - virtual void setGraphics(const std::shared_ptr& graphics_manager, kku::TimeRange&& range) const = 0; virtual void draw(const std::shared_ptr& graphics_manager) const = 0; void setState(State state) noexcept; diff --git a/src/modes/classicmode/include/classicmode/context.h b/src/modes/classicmode/include/classicmode/context.h index e7599dc..333fda4 100644 --- a/src/modes/classicmode/include/classicmode/context.h +++ b/src/modes/classicmode/include/classicmode/context.h @@ -12,5 +12,4 @@ public: virtual void input(ClassicArrowNote *note, kku::GameEvent&& input) const = 0; virtual void update(ClassicArrowNote *note, const kku::microsec &music_offset) const = 0; - virtual void display() const = 0; };