#pragma once #include "note.h" #include "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; struct Element { Type type; Coordinates coordinates; std::vector falling_curve_interpolation; std::array keys; }; std::vector elements; }; explicit ClassicNote(ClassicNoteInitializer&& init, const std::unique_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; 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::unique_ptr& _graphics_manager; State _state; };