project-kyoku/timeline.h

58 lines
1.7 KiB
C
Raw Normal View History

#ifndef TIMELINE_H
#define TIMELINE_H
#include <SFML/Config.hpp>
#include <SFML/Graphics/RectangleShape.hpp>
#include <vector>
#include <memory>
using microsec = sf::Int64;
class Note;
2021-04-17 18:14:36 +02:00
class TimelineViewManager;
class Timeline : public sf::Drawable // Probably it's bad
{
public:
2021-04-17 18:14:36 +02:00
explicit Timeline(std::unique_ptr<TimelineViewManager> view_manager);
virtual ~Timeline();
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
void update(const microsec& music_offset);
2021-04-15 17:03:35 +02:00
Note *fetchActiveNote(const microsec &music_offset) noexcept;
/* void init(); */
void clear();
private:
std::vector<Note*> _timeline;
std::vector<Note*>::const_iterator _top_note;
Note* _active_note;
std::vector<Note*>::const_iterator _last_visible_note;
microsec _visibility_offset;
2021-04-17 18:14:36 +02:00
std::unique_ptr<TimelineViewManager> _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