#pragma once #include "note.h" #include "precisionevaluator.h" #include "classicinputtype.h" #include "classicnotestate/classicnotestate.h" #include #include struct Coordinates { float x; float y; inline Coordinates operator+(const Coordinates& right) noexcept { return {right.x + x, right.y - y}; } }; // MOVE TO OWN HEADER ^ class ClassicSprite; class ClassicNote : public Note { public: enum class Grade { PERFECT, GOOD, BAD }; explicit ClassicNote(const std::vector& intervals, microsec perfect_offset, Action action, const Coordinates& coord); virtual ~ClassicNote() = default; virtual bool isActive() const override; virtual void update(const microsec &music_offset) override; virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override; virtual void putToGame(const microsec &offset) override; virtual bool isExpired() const override; Grade input(ClassicInputType&& input_data); Action action() const; std::shared_ptr sprite() const noexcept; void saveAppearanceTime(const microsec& offset); void setSprite(const std::shared_ptr& sprite) noexcept; const Coordinates& getCoordinates() const noexcept; private: const Coordinates _coordinates; const PrecisionEvaluator _evaluator; const Action _action; std::shared_ptr _sprite; microsec _appearance_time; float _trail_path_percent; //100% for sprite falling trajectory std::array, ClassicNoteState::COUNT> _states; ClassicNoteState::Value _current_state; };