#pragma once #include "core/note.h" #include "core/precisionevaluator.h" #include "classicactions.h" #include #include class ClassicSprite; class ClassicGraphicsManager; class ClassicAnimationScenario; class ClassicNote : public Note { public: enum class Grade { PERFECT, GOOD, BAD }; enum State { NONE, FLYING, ACTIVE, DYING, DEAD }; struct ClassicNoteInitializer { std::vector intervals; microsec perfect_offset; bool hold; struct Element { Type type; Coordinates coordinates; std::vector falling_curve_interpolation; std::array keys; }; std::vector elements; }; explicit ClassicNote(ClassicNoteInitializer&& init, const std::shared_ptr& manager); virtual ~ClassicNote() = default; virtual bool isActive() const override; virtual void update(const microsec &music_offset) override; virtual void input(PlayerInput&& inputdata) override; virtual void putToGame(const microsec &music_offset) override; virtual bool isInGame() const override; virtual bool shouldRemove() const override; virtual void draw() const override; bool isHold() const; bool allElementsPressed() const; bool isPressedAs(sf::Keyboard::Key key) const; private: struct NoteElement { std::shared_ptr sprite; std::array, 5> animations; std::array keys; Coordinates coordinates; // Each note may consist of several buttons. Type type; // For example, ↑ → or ↓ → ← // Note Element represents this idea. bool pressed = false; // Each ending button in such sequence sf::Keyboard::Key pressed_as; // is an element. }; std::vector _elements; const PrecisionEvaluator _evaluator; const std::shared_ptr _graphics_manager; State _state; bool _isHold; };