#ifndef TIMELINE_H #define TIMELINE_H #include #include #include #include using microsec = sf::Int64; class Note; class TimelineViewManager; class Timeline : public sf::Drawable // Probably it's bad { public: explicit Timeline(std::unique_ptr view_manager); virtual ~Timeline(); virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override; void update(const microsec& music_offset); Note *fetchActiveNote(const microsec &music_offset) noexcept; /* void init(); */ void clear(); private: std::vector _timeline; std::vector::const_iterator _top_note; Note* _active_note; std::vector::const_iterator _last_visible_note; microsec _visibility_offset; std::unique_ptr _view_manager; void checkCurrentActiveNote(const microsec &music_offset); void checkForNextActiveNote(const microsec &music_offset); void prepareNotesToDraw(const microsec &music_offset); /* Difference between top and active note is that * top note is the note handling input right now * OR it's the closest note from current music offset * position, not necessarily active. A note stops being top only * after dying or being tapped by player, even if it's already * past her perfect offset. * * Meanwhile active note is the note which is currently handling * player input for grade. * * An active note is always top note but a top note * is not always active note. * */ }; #endif // TIMELINE_H