diff --git a/include/core/timeline.h b/include/core/timeline.h index 7016615..d840dfc 100644 --- a/include/core/timeline.h +++ b/include/core/timeline.h @@ -135,6 +135,11 @@ public: return _top_note; } + inline Iterator begin() const noexcept + { + return _timeline.begin(); + } + private: std::set _timeline; microsec _current_offset; diff --git a/src/modes/classicmode/editor/classicmocknote.cpp b/src/modes/classicmode/editor/classicmocknote.cpp index d1e7c48..e8a1cc2 100644 --- a/src/modes/classicmode/editor/classicmocknote.cpp +++ b/src/modes/classicmode/editor/classicmocknote.cpp @@ -99,6 +99,12 @@ void ClassicMockNote::setGraphics(ClassicGraphicsManager * const manager, kku::T manager->setGraphics(_elements, std::move(range)); } +void ClassicMockNote::removeGraphics(ClassicGraphicsManager * const manager) +{ + manager->removeGraphics(_elements); +} + + std::vector& ClassicMockNote::getElements() { return _elements; diff --git a/src/modes/classicmode/editor/classicmocknote.h b/src/modes/classicmode/editor/classicmocknote.h index 620183b..07e9c98 100644 --- a/src/modes/classicmode/editor/classicmocknote.h +++ b/src/modes/classicmode/editor/classicmocknote.h @@ -19,6 +19,7 @@ public: virtual void display(const ClassicGraphicsManager * const manager) const override; virtual void setGraphics(ClassicGraphicsManager * const manager, kku::TimeRange&& range) override; + virtual void removeGraphics(ClassicGraphicsManager * const manager) override; std::vector& getElements(); diff --git a/src/modes/classicmode/game/classicarrownote.cpp b/src/modes/classicmode/game/classicarrownote.cpp index fa945e6..3fe21f2 100644 --- a/src/modes/classicmode/game/classicarrownote.cpp +++ b/src/modes/classicmode/game/classicarrownote.cpp @@ -104,6 +104,11 @@ void ClassicArrowNote::setGraphics(ClassicGraphicsManager * const manager, kku:: manager->setGraphics(_elements, std::move(range)); } +void ClassicArrowNote::removeGraphics(ClassicGraphicsManager * const manager) +{ + manager->removeGraphics(_elements); +} + bool ClassicArrowNote::allElementsPressed() const { return std::all_of(_elements.begin(), _elements.end(), diff --git a/src/modes/classicmode/game/classicarrownote.h b/src/modes/classicmode/game/classicarrownote.h index 614c6ba..29214a4 100644 --- a/src/modes/classicmode/game/classicarrownote.h +++ b/src/modes/classicmode/game/classicarrownote.h @@ -26,6 +26,7 @@ public: virtual void display(const ClassicGraphicsManager * const manager) const override; virtual void setGraphics(ClassicGraphicsManager * const manager, kku::TimeRange&& range) override; + virtual void removeGraphics(ClassicGraphicsManager * const manager) override; bool allElementsPressed() const; bool isPressedAs(kku::SystemEvent::Key::Code key) const; diff --git a/src/modes/classicmode/graphics/classicgraphicsmanager.h b/src/modes/classicmode/graphics/classicgraphicsmanager.h index 36fa08c..afdf370 100644 --- a/src/modes/classicmode/graphics/classicgraphicsmanager.h +++ b/src/modes/classicmode/graphics/classicgraphicsmanager.h @@ -21,9 +21,11 @@ public: virtual void display(const std::vector& elements) const = 0; virtual void setGraphics(std::vector& elements, kku::TimeRange&& range) = 0; + virtual void removeGraphics(std::vector& elements) = 0; virtual void display(const std::vector& elements) const = 0; virtual void setGraphics(std::vector& elements, kku::TimeRange&& range) = 0; + virtual void removeGraphics(std::vector& elements) = 0; virtual void display() const = 0; virtual void update(const kku::microsec& offset) = 0; diff --git a/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp b/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp index bc0883b..26c0803 100644 --- a/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp +++ b/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp @@ -87,6 +87,20 @@ void ClassicSceneGraphicsManager::setGraphics(std::vector& element } } +void ClassicSceneGraphicsManager::removeGraphics(std::vector& elements) +{ + for (auto& element : elements) + { + _sprite_container.resetSprite(element.sprite, element.type); + element.sprite = nullptr; + + element.animations[ClassicNote::State::NONE] = nullptr; + element.animations[ClassicNote::State::FLYING] = nullptr; + element.animations[ClassicNote::State::DYING] = nullptr; + element.animations[ClassicNote::State::DEAD] = nullptr; + } +} + void ClassicSceneGraphicsManager::display(const std::vector& elements) const { for (std::size_t i = 0; i < elements.size(); ++i) @@ -128,6 +142,20 @@ void ClassicSceneGraphicsManager::setGraphics(std::vector& elements } } +void ClassicSceneGraphicsManager::removeGraphics(std::vector& elements) +{ + for (auto& element : elements) + { + _sprite_container.resetSprite(element.sprite, element.type); + element.sprite = nullptr; + + element.animations[ClassicNote::State::NONE] = nullptr; + element.animations[ClassicNote::State::FLYING] = nullptr; + element.animations[ClassicNote::State::DYING] = nullptr; + element.animations[ClassicNote::State::DEAD] = nullptr; + } +} + /*sf::VertexArray ClassicSceneGraphicsSFML::makeLine(const kku::Point& c1, const kku::Point& c2) const { sf::VertexArray line(sf::LinesStrip, 2); @@ -147,19 +175,42 @@ void ClassicSceneGraphicsManager::updateVisibleNotes(const kku::microsec &offset void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset) { - (void)offset; // ???? - if (nothingToDraw()) return; - Iterator note_iterator = _first; - while (note_iterator != _last) + if (offset < (*_first)->getPerfectOffset()) { - auto note = *note_iterator; - if (note->getState() == ClassicNote::State::DEAD) - ++_first; + Iterator note_iterator = _first; + while (note_iterator != _timeline->begin() && !isVisiblyClose(note_iterator, offset)) + { + --note_iterator; + } - ++note_iterator; + _first = note_iterator; + + auto note = *_first; + if (note->getState() != ClassicNote::State::FLYING + && note->getState() != ClassicNote::State::DYING + && offset <= note->getPerfectOffset()) + { + note->setState(ClassicNote::State::FLYING); + note->setGraphics(this, kku::TimeRange{offset, note->getPerfectOffset()}); + } + } + else + { + Iterator note_iterator = _first; + while (note_iterator != _last) + { + auto note = *note_iterator; + if (note->getState() == ClassicNote::State::DEAD) + { + // note->removeGraphics(this); + ++_first; + } + + ++note_iterator; + } } } @@ -174,7 +225,8 @@ void ClassicSceneGraphicsManager::fetchLastNote(const kku::microsec& offset) auto note = *note_iterator; if (note->getState() != ClassicNote::State::FLYING - && note->getState() != ClassicNote::State::DYING) + && note->getState() != ClassicNote::State::DYING + && offset <= note->getPerfectOffset()) { note->setState(ClassicNote::State::FLYING); note->setGraphics(this, kku::TimeRange{offset, note->getPerfectOffset()}); diff --git a/src/modes/classicmode/graphics/classicscenegraphicsmanager.h b/src/modes/classicmode/graphics/classicscenegraphicsmanager.h index 3b9ede7..9c7407f 100644 --- a/src/modes/classicmode/graphics/classicscenegraphicsmanager.h +++ b/src/modes/classicmode/graphics/classicscenegraphicsmanager.h @@ -22,9 +22,11 @@ public: virtual void display(const std::vector& elements) const override; virtual void setGraphics(std::vector& elements, kku::TimeRange&& range) override; + virtual void removeGraphics(std::vector& elements) override; virtual void display(const std::vector& elements) const override; virtual void setGraphics(std::vector& elements, kku::TimeRange&& range) override; + virtual void removeGraphics(std::vector& elements) override; protected: kku::SpriteContainer _sprite_container; diff --git a/src/modes/classicmode/include/classicmode/classicnote.h b/src/modes/classicmode/include/classicmode/classicnote.h index 2168512..51c8b44 100644 --- a/src/modes/classicmode/include/classicmode/classicnote.h +++ b/src/modes/classicmode/include/classicmode/classicnote.h @@ -29,6 +29,7 @@ public: virtual void display(const ClassicGraphicsManager * const manager) const = 0; virtual void setGraphics(ClassicGraphicsManager * const manager, kku::TimeRange&& range) = 0; + virtual void removeGraphics(ClassicGraphicsManager * const manager) = 0; void setState(State state) noexcept; State getState() const noexcept;