From c57668675278903919ce642d7881a18168dbc4e8 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Tue, 18 Jan 2022 04:15:59 +0100 Subject: [PATCH] Separate sprite graphics from note logic --- src/impl/CMakeLists.txt | 3 +- src/impl/sfml/textsfml.h | 2 +- .../graphics/classicgraphicsmanager.h | 13 +- .../graphics/classicscenegraphicsmanager.cpp | 5 +- .../graphics/classicscenegraphicsmanager.h | 3 + .../classictimelinegraphicsmanager.cpp | 112 ++++++++++++++++++ .../graphics/classictimelinegraphicsmanager.h | 37 ++++++ .../include/classicmode/classicactions.h | 4 +- 8 files changed, 166 insertions(+), 13 deletions(-) create mode 100644 src/modes/classicmode/graphics/classictimelinegraphicsmanager.cpp create mode 100644 src/modes/classicmode/graphics/classictimelinegraphicsmanager.h diff --git a/src/impl/CMakeLists.txt b/src/impl/CMakeLists.txt index 624c324..aeda799 100644 --- a/src/impl/CMakeLists.txt +++ b/src/impl/CMakeLists.txt @@ -8,10 +8,9 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/shared) # check SFML by some compilation flag or idk file(GLOB_RECURSE SOURCES "sfml/*.cpp" "sfml/*.h") -find_package(SFML REQUIRED graphics window system) +find_package(SFML REQUIRED graphics window system audio) include_directories(${SFML_INCL_DIR} ${CMAKE_SOURCE_DIR}/include) target_link_libraries(project-kyoku sfml-system sfml-audio sfml-graphics sfml-network) -include_directories(${SFML_INCL_DIR} ${CMAKE_SOURCE_DIR}/include) ###### add_library(impl STATIC ${SOURCES}) diff --git a/src/impl/sfml/textsfml.h b/src/impl/sfml/textsfml.h index f2862af..aecbc98 100644 --- a/src/impl/sfml/textsfml.h +++ b/src/impl/sfml/textsfml.h @@ -22,6 +22,6 @@ public: virtual void display() override; protected: - std::shared_ptr _render_target; + sf::RenderTarget * const _render_target; sf::Text _text; }; diff --git a/src/modes/classicmode/graphics/classicgraphicsmanager.h b/src/modes/classicmode/graphics/classicgraphicsmanager.h index 90e824b..a1ec1b3 100644 --- a/src/modes/classicmode/graphics/classicgraphicsmanager.h +++ b/src/modes/classicmode/graphics/classicgraphicsmanager.h @@ -1,20 +1,18 @@ #pragma once -#include "core/spritecontainer.h" +#include "core/time.h" #include "classicmode/classicactions.h" -#include "graphics/classicspritefactory.h" -class ClassicSprite; +#include +#include + struct ArrowElement; class ClassicGraphicsManager : public std::enable_shared_from_this { public: virtual ~ClassicGraphicsManager() = default; - explicit ClassicGraphicsManager(const std::shared_ptr& factory, const kku::microsec& visibility_offset) : - _sprite_container({Type::UP, Type::DOWN, - Type::LEFT, Type::RIGHT}, - factory), + explicit ClassicGraphicsManager(const kku::microsec& visibility_offset) : _visibility_offset(visibility_offset) {} @@ -25,6 +23,5 @@ public: virtual void update(const kku::microsec& offset) = 0; protected: - kku::SpriteContainer _sprite_container; kku::microsec _visibility_offset; }; diff --git a/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp b/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp index e599636..0e0ae53 100644 --- a/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp +++ b/src/modes/classicmode/graphics/classicscenegraphicsmanager.cpp @@ -9,7 +9,10 @@ ClassicSceneGraphicsManager::ClassicSceneGraphicsManager(const std::shared_ptr>& timeline, const std::shared_ptr& factory, const kku::microsec& visibility_offset) : - ClassicGraphicsManager(factory, visibility_offset), + ClassicGraphicsManager(visibility_offset), + _sprite_container({Type::UP, Type::DOWN, + Type::LEFT, Type::RIGHT}, + factory), _timeline(timeline) { _timeline->expire(_first); diff --git a/src/modes/classicmode/graphics/classicscenegraphicsmanager.h b/src/modes/classicmode/graphics/classicscenegraphicsmanager.h index df27a60..bef2ae3 100644 --- a/src/modes/classicmode/graphics/classicscenegraphicsmanager.h +++ b/src/modes/classicmode/graphics/classicscenegraphicsmanager.h @@ -2,7 +2,9 @@ #include "game/classicnote.h" #include "graphics/classicgraphicsmanager.h" +#include "graphics/classicspritefactory.h" #include "core/timeline.h" +#include "core/spritecontainer.h" class ClassicSprite; @@ -20,6 +22,7 @@ public: virtual void setGraphics(std::vector& elements, kku::TimeRange&& range) override; protected: + kku::SpriteContainer _sprite_container; using Iterator = kku::Timeline::Iterator; Iterator _first; diff --git a/src/modes/classicmode/graphics/classictimelinegraphicsmanager.cpp b/src/modes/classicmode/graphics/classictimelinegraphicsmanager.cpp new file mode 100644 index 0000000..a3abe47 --- /dev/null +++ b/src/modes/classicmode/graphics/classictimelinegraphicsmanager.cpp @@ -0,0 +1,112 @@ +#include "classictimelinegraphicsmanager.h" +#include "graphics/classicsprite.h" + +#include "game/arrowelement.h" + +#include "graphics/animations/classicflyinganimationscenario.h" +#include "graphics/animations/classicdyinganimationscenario.h" + +ClassicTimelineGraphicsManager::ClassicTimelineGraphicsManager(const std::shared_ptr>& timeline, + const std::shared_ptr& factory, + const kku::microsec& visibility_offset) : + ClassicGraphicsManager(factory, visibility_offset), + _timeline(timeline), + _display_offset(0) +{ + _timeline->expire(_first); + _timeline->expire(_last); + + _sprites[Type::NONE] = nullptr; + _sprites[Type::UP] = factory->getSprite(Type::UP); + _sprites[Type::RIGHT] = factory->getSprite(Type::RIGHT); + _sprites[Type::DOWN] = factory->getSprite(Type::DOWN); + _sprites[Type::LEFT] = factory->getSprite(Type::LEFT); + //_sprites[Type::SLIDER_RIGHT] = factory->getSprite(Type::SLIDER_RIGHT); + //_sprites[Type::SLIDER_LEFT] = factory->getSprite(Type::SLIDER_LEFT); +} + +void ClassicTimelineGraphicsManager::display() const +{ + if (nothingToDraw()) + return; + + for (auto it = _first; it != _last; ++it) + { + const auto& note = (*it); + note->display(this); + } +} + +void ClassicTimelineGraphicsManager::update(const kku::microsec &offset) +{ + _timeline->expire(_first); + _timeline->expire(_last); + + fetchLastNote(offset); + fetchFirstNote(offset); + + _display_offset = offset; +} + +void ClassicTimelineGraphicsManager::display(const std::vector& elements) const +{ + for (std::size_t i = 0; i < elements.size(); ++i) + { + auto sprite = *_sprites.at(elements.at(i).type) + + if (i >= 1) + { + //const auto& neighbor_sprite = elements[i - 1].sprite; + + //const auto c1 = neighbor_sprite->trailPosition(); + //const auto c2 = sprite->trailPosition(); + + //_render_target->draw(makeLine(c1, c2)); + } + + sprite->setPosition(kku::Position{}); + sprite->display(); + } +} + +void ClassicTimelineGraphicsManager::fetchFirstNote(const kku::microsec& offset) +{ + if (nothingToDraw()) + return; + + Iterator note_iterator = _first; + while (!_timeline->isExpired(note_iterator) && isVisiblyClose(note_iterator, offset)) + { + --note_iterator; + } + + _first = note_iterator; +} + +void ClassicTimelineGraphicsManager::fetchLastNote(const kku::microsec& offset) +{ + Iterator note_iterator = _timeline->getTopNote(); + while (!_timeline->isExpired(note_iterator) && isVisiblyClose(note_iterator, offset)) + { + if (nothingToDraw()) + _first = note_iterator; + + ++note_iterator; + } + + _last = note_iterator; +} + +bool ClassicTimelineGraphicsManager::nothingToDraw() const noexcept +{ + return _timeline->isExpired(_first) + || _timeline->isExpired(_last); +} + +bool ClassicTimelineGraphicsManager::isVisiblyClose(const Iterator& iterator, const kku::microsec& music_offset) const noexcept +{ + const auto& perfect_offset = (*iterator)->getPerfectOffset(); + + return ((perfect_offset - _visibility_offset) <= music_offset) + || ((perfect_offset + (_visibility_offset / 4.)) >= music_offset); +} diff --git a/src/modes/classicmode/graphics/classictimelinegraphicsmanager.h b/src/modes/classicmode/graphics/classictimelinegraphicsmanager.h new file mode 100644 index 0000000..4ef9aa6 --- /dev/null +++ b/src/modes/classicmode/graphics/classictimelinegraphicsmanager.h @@ -0,0 +1,37 @@ +#pragma once + +#include "game/classicnote.h" +#include "graphics/classicgraphicsmanager.h" +#include "core/timeline.h" + +class ClassicSprite; + +class ClassicTimelineGraphicsManager : public ClassicGraphicsManager +{ +public: + explicit ClassicTimelineGraphicsManager(const std::shared_ptr>& timeline, + const std::shared_ptr& factory, + const kku::microsec& visibility_offset); + + virtual void display() const override; + virtual void update(const kku::microsec& offset) override; + + virtual void display(const std::vector& elements) const override; + +protected: + using Iterator = kku::Timeline::Iterator; + + Iterator _first; + Iterator _last; + + const std::shared_ptr> _timeline; + kku::microsec _display_offset; + + mutable std::map, Type::COUNT> _sprites; + + inline bool nothingToDraw() const noexcept; + inline bool isVisiblyClose(const Iterator& iterator, const kku::microsec& music_offset) const noexcept; + + void fetchFirstNote(const kku::microsec& offset); + void fetchLastNote(const kku::microsec& offset); +}; diff --git a/src/modes/classicmode/include/classicmode/classicactions.h b/src/modes/classicmode/include/classicmode/classicactions.h index 1e7e0d7..f48ad59 100644 --- a/src/modes/classicmode/include/classicmode/classicactions.h +++ b/src/modes/classicmode/include/classicmode/classicactions.h @@ -25,5 +25,7 @@ enum class Type LEFT, SLIDER_RIGHT, - SLIDER_LEFT + SLIDER_LEFT, + + COUNT };