#pragma once #include "note.h" #include "precisionevaluator.h" #include "classicinputtype.h" #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 }; enum class State { FLYING, DYING, DEAD }; explicit ClassicNote(const std::vector& intervals, microsec perfect_offset, Action action, const Coordinates& coord); virtual ~ClassicNote() = default; virtual bool isActive(const microsec& music_offset) const override; virtual void update(const microsec &music_offset) override; virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override; Grade input(ClassicInputType&& input_data); Action action() const; State state() const; void setState(State next_state); 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; State _state = State::FLYING; std::shared_ptr _sprite; microsec _appearance_time; float _trail_path_percent; //100% for sprite falling trajectory };