#include "classictimelinegraphicsmanager.h" #include "game/classicarrownote.h" #include ClassicTimelineGraphicsManager::ClassicTimelineGraphicsManager( const std::shared_ptr> &timeline, const std::shared_ptr &factory, const kku::microsec &visibility_offset) : ClassicGraphicsManager(visibility_offset), _sprite_container({Type::UP, Type::DOWN, Type::LEFT, Type::RIGHT}, factory), _factory(factory), _timeline(timeline), _back_visibility_offset(static_cast(visibility_offset) / 4.f), _last_offset(0) { _timeline->expire(_first); _timeline->expire(_last); } void ClassicTimelineGraphicsManager::input(kku::GameEvent &&input) { switch (input.event.type) { default: break; case kku::SystemEvent::Type::KeyPress: { const auto key_data = std::get(input.event.data); if (key_data.view == kku::SystemEvent::Key::Code::Add) { _visibility_offset += 200000; _back_visibility_offset = static_cast(_visibility_offset) / 4.f; } else if (key_data.view == kku::SystemEvent::Key::Code::Subtract) { _visibility_offset -= 200000; _back_visibility_offset = static_cast(_visibility_offset) / 4.f; } break; } } } void ClassicTimelineGraphicsManager::display() const { // if (nothingToDraw()) // return; std::cout << "displaying on tl: "; for (auto it = _first; it != _last; ++it) { std::cout << (*it)->getId() << " "; (*it)->draw(shared_from_this()); } std::cout << "\n" << std::flush; } void ClassicTimelineGraphicsManager::update(const kku::microsec &offset) { _last_offset = offset; fetchLastNote(offset); fetchFirstNote(offset); } void ClassicTimelineGraphicsManager::update(const kku::microsec &offset, ClassicArrowNote *note) { bool hasGraphics = (note->getElements()[0].sprite != nullptr); if (isVisiblyClose(note, offset) && !hasGraphics) { std::cout << note->getId() << ": set graphics!\n" << std::flush; } else { std::cout << note->getId() << ": remove graphics!\n" << std::flush; } } void ClassicTimelineGraphicsManager::draw( const ClassicArrowNote *const note) const { const double d_visibility_offset = static_cast(_last_offset + _visibility_offset); const double d_back_visibility_offset = static_cast(_last_offset - _back_visibility_offset); const double span = d_visibility_offset - d_back_visibility_offset; const double note_span = static_cast(note->getPerfectOffset()) - d_visibility_offset; const double percent = note_span / (span / 100.f); const auto elements = note->getElements(); for (std::size_t i = 0; i < elements.size(); ++i) { auto timeline_sprite = _factory->createSprite(elements[i].type); timeline_sprite->setPosition( kku::Point{static_cast(850 + 1280.f / 100.f * percent), 700}); timeline_sprite->display(); } } bool ClassicTimelineGraphicsManager::nothingToDraw() const noexcept { return _timeline->isExpired(_first) || _timeline->isExpired(_last); } bool ClassicTimelineGraphicsManager::isVisiblyClose( const ClassicNote *const note, const kku::microsec &music_offset) const noexcept { const auto &perfect_offset = note->getPerfectOffset(); return ((perfect_offset - _visibility_offset) <= music_offset) || ((perfect_offset + (_visibility_offset / 4.)) >= music_offset); } void ClassicTimelineGraphicsManager::fetchFirstNote(const kku::microsec &offset) { // if (nothingToDraw()) // return; Iterator note_iterator = _first; while (note_iterator != _timeline->begin() && isVisiblyClose(*note_iterator, offset)) { --note_iterator; } _first = note_iterator; } void ClassicTimelineGraphicsManager::fetchLastNote(const kku::microsec &offset) { Iterator note_iterator = _timeline->getTopNote(); while (!_timeline->isExpired(note_iterator) && isVisiblyClose(*note_iterator, offset)) { if (nothingToDraw()) _first = note_iterator; ++note_iterator; } _last = note_iterator; }