|
|
|
@ -14,7 +14,6 @@ ClassicTimeline::ClassicTimeline()
|
|
|
|
|
std::string song_filename = "/home/naiji/METEOR.flac";
|
|
|
|
|
|
|
|
|
|
_music.openFromFile(song_filename);
|
|
|
|
|
_music.play();
|
|
|
|
|
_music.setVolume(10);
|
|
|
|
|
|
|
|
|
|
_timeline.reserve(1000);
|
|
|
|
@ -25,7 +24,7 @@ ClassicTimeline::ClassicTimeline()
|
|
|
|
|
microsec note_input_offset = 412162;
|
|
|
|
|
microsec bpm_iterator = starting_beat_offset;
|
|
|
|
|
microsec bpm_end = starting_beat_offset + (interval * amount_of_beats);
|
|
|
|
|
_visibility_offset = note_input_offset * 12;
|
|
|
|
|
_visibility_offset = note_input_offset * 6;
|
|
|
|
|
|
|
|
|
|
_timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_DOWN, {90, 90}));
|
|
|
|
|
bpm_iterator += interval;
|
|
|
|
@ -42,14 +41,14 @@ ClassicTimeline::ClassicTimeline()
|
|
|
|
|
bpm_iterator += interval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
expire(_last_visible_note);
|
|
|
|
|
expire(_active_note);
|
|
|
|
|
_top_note = _timeline.begin();
|
|
|
|
|
_last_visible_note = _top_note;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClassicTimeline::init()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
_music.play();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ClassicTimeline::~ClassicTimeline()
|
|
|
|
@ -70,8 +69,7 @@ void ClassicTimeline::clear()
|
|
|
|
|
|
|
|
|
|
void ClassicTimeline::update()
|
|
|
|
|
{
|
|
|
|
|
const auto& offset = currentMusicOffset();
|
|
|
|
|
std::cout << "Upadting at: " << offset << '\n';
|
|
|
|
|
const microsec& offset = currentMusicOffset();
|
|
|
|
|
checkCurrentActiveNote(offset);
|
|
|
|
|
checkForNextActiveNote(offset);
|
|
|
|
|
}
|
|
|
|
@ -100,7 +98,7 @@ ClassicTimeline::Iterator ClassicTimeline::getActiveNote() noexcept
|
|
|
|
|
return _active_note;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ClassicTimeline::isExpired(const Iterator &iterator)
|
|
|
|
|
bool ClassicTimeline::isExpired(const Iterator &iterator) const
|
|
|
|
|
{
|
|
|
|
|
return iterator == _timeline.end();
|
|
|
|
|
}
|
|
|
|
@ -115,15 +113,40 @@ microsec ClassicTimeline::currentMusicOffset() const
|
|
|
|
|
return _music.getPlayingOffset().asMicroseconds();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClassicTimeline::discardExpiredNotes(const std::unique_ptr<ClassicViewManager> &view_manager, const microsec &music_offset)
|
|
|
|
|
{
|
|
|
|
|
if (_top_note == _timeline.begin())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
Iterator past_note = _top_note - 1;
|
|
|
|
|
std::shared_ptr<ClassicSprite> sprite = (*past_note)->sprite();
|
|
|
|
|
while (sprite)
|
|
|
|
|
{ // CAREFULLY REWRITE
|
|
|
|
|
view_manager->resetNoteSprite(*past_note);
|
|
|
|
|
if (past_note == _timeline.begin())
|
|
|
|
|
return;
|
|
|
|
|
--past_note;
|
|
|
|
|
sprite = (*past_note)->sprite();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ClassicTimeline::isVisiblyClose(const Iterator &iterator, const microsec &music_offset) const
|
|
|
|
|
{
|
|
|
|
|
return ((*iterator)->offset() - _visibility_offset) <= music_offset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClassicTimeline::fetchVisibleNotes(const std::unique_ptr<ClassicViewManager>& view_manager)
|
|
|
|
|
{
|
|
|
|
|
Iterator note_iterator = _top_note;
|
|
|
|
|
auto music_offset = currentMusicOffset();
|
|
|
|
|
microsec music_offset = currentMusicOffset();
|
|
|
|
|
discardExpiredNotes(view_manager, music_offset);
|
|
|
|
|
|
|
|
|
|
while (((*note_iterator)->offset() - _visibility_offset) <= music_offset)
|
|
|
|
|
Iterator note_iterator = _top_note;
|
|
|
|
|
while (isVisiblyClose(note_iterator, music_offset))
|
|
|
|
|
{
|
|
|
|
|
if (note_iterator > _last_visible_note)
|
|
|
|
|
view_manager->initNoteSprite(*note_iterator);
|
|
|
|
|
ClassicNote* note = *note_iterator;
|
|
|
|
|
if (!note->sprite())
|
|
|
|
|
view_manager->initNoteSprite(note);
|
|
|
|
|
|
|
|
|
|
++note_iterator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -132,7 +155,9 @@ void ClassicTimeline::fetchVisibleNotes(const std::unique_ptr<ClassicViewManager
|
|
|
|
|
|
|
|
|
|
void ClassicTimeline::drawVisibleNotes(sf::RenderWindow &window) const
|
|
|
|
|
{
|
|
|
|
|
if (_last_visible_note == _timeline.end() || _top_note > _last_visible_note)
|
|
|
|
|
bool no_visible_notes = isExpired(_last_visible_note)
|
|
|
|
|
|| _top_note > _last_visible_note;
|
|
|
|
|
if (no_visible_notes)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
Iterator note_to_draw = _top_note;
|
|
|
|
|