project-kyoku/modes/classicmode/game/classicarrownote.cpp

124 lines
3.5 KiB
C++
Raw Normal View History

2021-09-28 05:48:06 +02:00
#include "classicarrownote.h"
2021-12-27 19:41:25 +01:00
#include "graphics/classicgraphicsmanager.h"
#include "graphics/classicanimationscenario.h"
2021-10-04 17:30:21 +02:00
#include "holdmanager.h"
2021-09-28 05:48:06 +02:00
ClassicArrowNote::ClassicArrowNote(ArrowNoteInitializer&& init) :
ClassicNote(std::move(init.initializer)),
_is_hold(init.hold)
{
_elements.resize(init.elements.size());
for (std::size_t i = 0; i < _elements.size(); ++i)
{
_elements[i].keys = init.elements[i].keys;
2021-09-28 05:48:06 +02:00
_elements[i].coordinates = init.elements[i].element.coordinates;
_elements[i].type = init.elements[i].element.type;
2021-09-28 05:48:06 +02:00
}
}
void ClassicArrowNote::putToGame()
2021-09-28 05:48:06 +02:00
{
_state = State::FLYING;
2021-09-28 05:48:06 +02:00
}
void ClassicArrowNote::input(PlayerInput&& inputdata)
{
auto grade = ClassicNote::Grade::BAD;
bool input_valid = std::any_of(_elements.begin(), _elements.end(),
[inputdata=inputdata](auto& element)
{
if (element.pressed)
return false;
auto key_iterator = std::find(element.keys.begin(), element.keys.end(), inputdata.event.key.code);
bool found_key = key_iterator != element.keys.end();
if (found_key)
{
element.pressed = true;
element.pressed_as = inputdata.event.key.code;
}
return found_key;
});
bool all_pressed = allElementsPressed();
if (all_pressed)
2021-10-04 17:30:21 +02:00
{
2021-09-28 05:48:06 +02:00
grade = _evaluator.calculatePrecision(inputdata.timestamp);
2021-10-04 17:30:21 +02:00
if (isHold())
_context->hold_manager->emplace(this);
}
2021-09-28 05:48:06 +02:00
if (all_pressed || !input_valid)
{
_state = State::DYING;
for (auto& element : _elements)
element.animations[_state]->launch(element.sprite, inputdata.timestamp, offset());
}
std::cout << "User input: " << static_cast<int>(grade) << "\n";
}
void ClassicArrowNote::update(const microsec& music_offset)
{
switch (_state)
{
default: return;
break;
case State::FLYING:
if (!_evaluator.isActive(music_offset) && music_offset > offset())
{
_state = State::DYING;
for (auto& element : _elements)
element.animations[_state]->launch(element.sprite, music_offset, offset());
2021-10-03 17:23:28 +02:00
}
2021-09-28 05:48:06 +02:00
break;
case State::DYING:
if (_elements[0].animations[_state]->isDone())
_state = State::DEAD;
break;
}
for (auto& element : _elements)
if (element.animations[_state])
element.animations[_state]->update(music_offset);
}
void ClassicArrowNote::draw(const ClassicGraphicsManager * const manager, sf::RenderTarget& target, sf::RenderStates states) const
{
manager->draw(_elements, target, states);
}
void ClassicArrowNote::setGraphics(ClassicGraphicsManager * const manager, TimeRange&& range)
{
manager->setGraphics(_elements, std::move(range));
}
2021-09-28 05:48:06 +02:00
bool ClassicArrowNote::allElementsPressed() const
{
return std::all_of(_elements.begin(), _elements.end(),
[](const auto& element)
{
return element.pressed;
});
}
bool ClassicArrowNote::isPressedAs(sf::Keyboard::Key key) const
{
return std::any_of(_elements.begin(), _elements.end(),
[key](const auto& element)
2021-09-28 05:48:06 +02:00
{
return key == element.pressed_as;
});
}
2021-10-04 17:30:21 +02:00
bool ClassicArrowNote::isHold() const
{
return _is_hold;
}