|
|
|
@ -11,7 +11,9 @@ ClassicTimelineGraphicsManager::ClassicTimelineGraphicsManager(const std::shared
|
|
|
|
|
Type::LEFT, Type::RIGHT},
|
|
|
|
|
factory),
|
|
|
|
|
_factory(factory),
|
|
|
|
|
_timeline(timeline)
|
|
|
|
|
_timeline(timeline),
|
|
|
|
|
_back_visibility_offset(static_cast<double>(visibility_offset) / 4.f),
|
|
|
|
|
_last_offset(0)
|
|
|
|
|
{
|
|
|
|
|
_timeline->expire(_first);
|
|
|
|
|
_timeline->expire(_last);
|
|
|
|
@ -19,34 +21,49 @@ ClassicTimelineGraphicsManager::ClassicTimelineGraphicsManager(const std::shared
|
|
|
|
|
|
|
|
|
|
void ClassicTimelineGraphicsManager::input(kku::GameEvent&& input)
|
|
|
|
|
{
|
|
|
|
|
if (nothingToDraw())
|
|
|
|
|
return;
|
|
|
|
|
switch (input.event.type)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
for (auto it = _first; it != _last; ++it)
|
|
|
|
|
case kku::SystemEvent::Type::KeyPress:
|
|
|
|
|
{
|
|
|
|
|
(*it)->input(std::move(input));
|
|
|
|
|
const auto key_data = std::get<kku::SystemEvent::Key>(input.event.data);
|
|
|
|
|
if (key_data.view == kku::SystemEvent::Key::Code::Add)
|
|
|
|
|
{
|
|
|
|
|
_visibility_offset += 200000;
|
|
|
|
|
_back_visibility_offset = static_cast<double>(_visibility_offset) / 4.f;
|
|
|
|
|
}
|
|
|
|
|
else if (key_data.view == kku::SystemEvent::Key::Code::Subtract)
|
|
|
|
|
{
|
|
|
|
|
_visibility_offset -= 200000;
|
|
|
|
|
_back_visibility_offset = static_cast<double>(_visibility_offset) / 4.f;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClassicTimelineGraphicsManager::display() const
|
|
|
|
|
{
|
|
|
|
|
if (nothingToDraw())
|
|
|
|
|
return;
|
|
|
|
|
//if (nothingToDraw())
|
|
|
|
|
//return;
|
|
|
|
|
|
|
|
|
|
std::cout << "displaying on tl: ";
|
|
|
|
|
for (auto it = _first; it != _last; ++it)
|
|
|
|
|
{
|
|
|
|
|
const auto note = *it;
|
|
|
|
|
if (note->getState() != ClassicNote::State::DEAD)
|
|
|
|
|
note->draw(shared_from_this());
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
updateVisibleNotes(offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClassicTimelineGraphicsManager::update(const kku::microsec& offset, ClassicArrowNote* note)
|
|
|
|
@ -63,21 +80,23 @@ void ClassicTimelineGraphicsManager::update(const kku::microsec& offset, Classic
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClassicTimelineGraphicsManager::draw(const std::vector<ArrowElement>& elements) const
|
|
|
|
|
void ClassicTimelineGraphicsManager::draw(const ClassicArrowNote * const note) const
|
|
|
|
|
{
|
|
|
|
|
const double d_visibility_offset = static_cast<double>(_last_offset + _visibility_offset);
|
|
|
|
|
const double d_back_visibility_offset = static_cast<double>(_last_offset - _back_visibility_offset);
|
|
|
|
|
|
|
|
|
|
const double span = d_visibility_offset - d_back_visibility_offset;
|
|
|
|
|
const double note_span = static_cast<double>(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)
|
|
|
|
|
{
|
|
|
|
|
const auto& sprite = elements[i].sprite;
|
|
|
|
|
auto timeline_sprite = _factory->createSprite(elements[i].type);
|
|
|
|
|
timeline_sprite->setPosition(kku::Point{static_cast<int>(850 + 1280.f / 100.f * percent), 700});
|
|
|
|
|
|
|
|
|
|
if (i >= 1)
|
|
|
|
|
{
|
|
|
|
|
//const auto& neighbor_sprite = elements[i - 1].sprite;
|
|
|
|
|
//const auto c1 = neighbor_sprite->trailPosition();
|
|
|
|
|
//const auto c2 = sprite->trailPosition();
|
|
|
|
|
//_render_target->draw(makeLine(c1, c2));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprite->display();
|
|
|
|
|
timeline_sprite->display();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -89,49 +108,24 @@ bool ClassicTimelineGraphicsManager::nothingToDraw() const noexcept
|
|
|
|
|
|
|
|
|
|
bool ClassicTimelineGraphicsManager::isVisiblyClose(const ClassicNote * const note, const kku::microsec& music_offset) const noexcept
|
|
|
|
|
{
|
|
|
|
|
return (note->getPerfectOffset() - _visibility_offset) <= music_offset;
|
|
|
|
|
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;
|
|
|
|
|
//if (nothingToDraw())
|
|
|
|
|
//return;
|
|
|
|
|
|
|
|
|
|
if (offset < (*_first)->getPerfectOffset())
|
|
|
|
|
Iterator note_iterator = _first;
|
|
|
|
|
while (note_iterator != _timeline->begin() && isVisiblyClose(*note_iterator, offset))
|
|
|
|
|
{
|
|
|
|
|
Iterator note_iterator = _first;
|
|
|
|
|
while (note_iterator != _timeline->begin() && isVisiblyClose(*note_iterator, offset))
|
|
|
|
|
{
|
|
|
|
|
--note_iterator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_first = note_iterator;
|
|
|
|
|
|
|
|
|
|
auto note = *_first;
|
|
|
|
|
const auto state = note->getState();
|
|
|
|
|
if (state != ClassicNote::State::FLYING
|
|
|
|
|
&& state != ClassicNote::State::DYING
|
|
|
|
|
&& state != ClassicNote::State::INITIAL
|
|
|
|
|
&& offset <= note->getPerfectOffset())
|
|
|
|
|
{
|
|
|
|
|
note->setState(ClassicNote::State::INITIAL);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Iterator note_iterator = _first;
|
|
|
|
|
while (note_iterator != _last)
|
|
|
|
|
{
|
|
|
|
|
auto note = *note_iterator;
|
|
|
|
|
if (note->getState() == ClassicNote::State::DEAD)
|
|
|
|
|
{
|
|
|
|
|
// note->removeGraphics(this);
|
|
|
|
|
++_first;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
++note_iterator;
|
|
|
|
|
}
|
|
|
|
|
--note_iterator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_first = note_iterator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClassicTimelineGraphicsManager::fetchLastNote(const kku::microsec& offset)
|
|
|
|
@ -142,24 +136,8 @@ void ClassicTimelineGraphicsManager::fetchLastNote(const kku::microsec& offset)
|
|
|
|
|
if (nothingToDraw())
|
|
|
|
|
_first = note_iterator;
|
|
|
|
|
|
|
|
|
|
auto note = *note_iterator;
|
|
|
|
|
const auto state = note->getState();
|
|
|
|
|
if (state != ClassicNote::State::FLYING
|
|
|
|
|
&& state != ClassicNote::State::DYING
|
|
|
|
|
&& state != ClassicNote::State::INITIAL
|
|
|
|
|
&& offset <= note->getPerfectOffset())
|
|
|
|
|
{
|
|
|
|
|
note->setState(ClassicNote::State::INITIAL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
++note_iterator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_last = note_iterator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClassicTimelineGraphicsManager::updateVisibleNotes(const kku::microsec& offset)
|
|
|
|
|
{
|
|
|
|
|
for (auto it = _first; it != _last; ++it)
|
|
|
|
|
(*it)->update(offset);
|
|
|
|
|
}
|
|
|
|
|