|
|
@ -9,14 +9,27 @@ ClassicNote::ClassicNote(const std::vector<microsec>& intervals, microsec perfec
|
|
|
|
_coordinates(coord),
|
|
|
|
_coordinates(coord),
|
|
|
|
_evaluator(intervals, _perfect_offset),
|
|
|
|
_evaluator(intervals, _perfect_offset),
|
|
|
|
_action(action),
|
|
|
|
_action(action),
|
|
|
|
_state(State::NONE),
|
|
|
|
|
|
|
|
_appearance_time(0),
|
|
|
|
_appearance_time(0),
|
|
|
|
_last_offset(0)
|
|
|
|
_current_state(ClassicNoteState::NONE)
|
|
|
|
{}
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
bool ClassicNote::isActive(const microsec& music_offset) const
|
|
|
|
bool ClassicNote::isActive() const
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return _evaluator.isActive(music_offset);
|
|
|
|
return _states.at(_current_state)->value() == ClassicNoteState::ACTIVE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ClassicNote::putToGame(const microsec &offset)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_appearance_time = offset; // To animation manager
|
|
|
|
|
|
|
|
_trail_path_percent = ((_perfect_offset - _appearance_time) * 0.01);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_current_state = ClassicNoteState::FLYING;
|
|
|
|
|
|
|
|
_states.at(_current_state)->onEntering(this);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool ClassicNote::isExpired() const
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return _states.at(_current_state)->value() == ClassicNoteState::NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int getPt( float n1 , float n2 , float perc )
|
|
|
|
static int getPt( float n1 , float n2 , float perc )
|
|
|
@ -28,29 +41,42 @@ static int getPt( float n1 , float n2 , float perc )
|
|
|
|
|
|
|
|
|
|
|
|
void ClassicNote::update(const microsec& music_offset)
|
|
|
|
void ClassicNote::update(const microsec& music_offset)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
switch (_state) // States will be objects
|
|
|
|
_states.at(_current_state)->update(this, music_offset);
|
|
|
|
|
|
|
|
/*switch (_state) // States will be objects
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case State::DYING:
|
|
|
|
case State::DYING:
|
|
|
|
_sprite->update();
|
|
|
|
_sprite->update();
|
|
|
|
if (_sprite->isDead())
|
|
|
|
if (_sprite->isDead())
|
|
|
|
setState(State::DEAD);
|
|
|
|
setState(State::NONE);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case State::FLYING:
|
|
|
|
case State::FLYING:
|
|
|
|
{
|
|
|
|
{
|
|
|
|
float i;
|
|
|
|
float i;
|
|
|
|
if (music_offset != _last_offset)
|
|
|
|
auto update_time = music_offset - _appearance_time; // This all will be inside ::update
|
|
|
|
{
|
|
|
|
i = update_time / _trail_path_percent * 0.01; // of an animation object
|
|
|
|
auto update_time = music_offset - _appearance_time; // This all will be inside ::update
|
|
|
|
|
|
|
|
i = update_time / _trail_path_percent * 0.01; // of an animation object
|
|
|
|
float xa = getPt( _coordinates.x + 20. , _coordinates.x + 90. , i );
|
|
|
|
}
|
|
|
|
float ya = getPt( _coordinates.y - 600. , _coordinates.y - 150. , i );
|
|
|
|
else
|
|
|
|
float xb = getPt( _coordinates.x + 90. , _coordinates.x , i );
|
|
|
|
|
|
|
|
float yb = getPt( _coordinates.y - 150. , _coordinates.y , i );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_sprite->update(getPt( xa , xb , i ), getPt( ya , yb , i ));
|
|
|
|
|
|
|
|
if (i >= 1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
auto update_time = music_offset + 10000 - _appearance_time;
|
|
|
|
_sprite->trailFade();
|
|
|
|
i = update_time / _trail_path_percent * 0.01;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_last_offset = music_offset;
|
|
|
|
if (_evaluator.isActive(music_offset))
|
|
|
|
|
|
|
|
setState(State::ACTIVE);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case State::ACTIVE:
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
float i;
|
|
|
|
|
|
|
|
auto update_time = music_offset - _appearance_time; // This all will be inside ::update
|
|
|
|
|
|
|
|
i = update_time / _trail_path_percent * 0.01; // of an animation object
|
|
|
|
|
|
|
|
|
|
|
|
float xa = getPt( _coordinates.x + 20. , _coordinates.x + 90. , i );
|
|
|
|
float xa = getPt( _coordinates.x + 20. , _coordinates.x + 90. , i );
|
|
|
|
float ya = getPt( _coordinates.y - 600. , _coordinates.y - 150. , i );
|
|
|
|
float ya = getPt( _coordinates.y - 600. , _coordinates.y - 150. , i );
|
|
|
@ -59,13 +85,18 @@ void ClassicNote::update(const microsec& music_offset)
|
|
|
|
|
|
|
|
|
|
|
|
_sprite->update(getPt( xa , xb , i ), getPt( ya , yb , i ));
|
|
|
|
_sprite->update(getPt( xa , xb , i ), getPt( ya , yb , i ));
|
|
|
|
if (i >= 1)
|
|
|
|
if (i >= 1)
|
|
|
|
|
|
|
|
{
|
|
|
|
_sprite->trailFade();
|
|
|
|
_sprite->trailFade();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!_evaluator.isActive(music_offset))
|
|
|
|
|
|
|
|
setState(State::DYING);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ClassicNote::draw(sf::RenderTarget& target, sf::RenderStates states) const
|
|
|
|
void ClassicNote::draw(sf::RenderTarget& target, sf::RenderStates states) const
|
|
|
@ -80,7 +111,8 @@ auto ClassicNote::input(ClassicInputType&& input_data) -> Grade
|
|
|
|
if (input_data == _action)
|
|
|
|
if (input_data == _action)
|
|
|
|
grade = _evaluator.calculatePrecision(input_data.timestamp());
|
|
|
|
grade = _evaluator.calculatePrecision(input_data.timestamp());
|
|
|
|
|
|
|
|
|
|
|
|
setState(State::DYING);
|
|
|
|
_current_state = ClassicNoteState::DYING;
|
|
|
|
|
|
|
|
_states.at(_current_state)->onEntering(this);
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << "User input: " << static_cast<int>(grade) << "\n";
|
|
|
|
std::cout << "User input: " << static_cast<int>(grade) << "\n";
|
|
|
|
|
|
|
|
|
|
|
@ -92,12 +124,7 @@ Action ClassicNote::action() const
|
|
|
|
return _action;
|
|
|
|
return _action;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
auto ClassicNote::state() const -> State
|
|
|
|
/*void ClassicNote::setState(State next_state)
|
|
|
|
{
|
|
|
|
|
|
|
|
return _state;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ClassicNote::setState(State next_state)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
switch (next_state) // States will be objects
|
|
|
|
switch (next_state) // States will be objects
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -118,24 +145,16 @@ void ClassicNote::setState(State next_state)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_state = next_state;
|
|
|
|
_state = next_state;
|
|
|
|
}
|
|
|
|
} */
|
|
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<ClassicSprite> ClassicNote::sprite() const noexcept
|
|
|
|
std::shared_ptr<ClassicSprite> ClassicNote::sprite() const noexcept
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return _sprite;
|
|
|
|
return _sprite;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ClassicNote::saveAppearanceTime(const microsec &offset)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_appearance_time = offset;
|
|
|
|
|
|
|
|
_trail_path_percent = ((_perfect_offset - _appearance_time) * 0.01);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ClassicNote::setSprite(const std::shared_ptr<ClassicSprite>& sprite) noexcept
|
|
|
|
void ClassicNote::setSprite(const std::shared_ptr<ClassicSprite>& sprite) noexcept
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_sprite = sprite;
|
|
|
|
_sprite = sprite;
|
|
|
|
if (_sprite)
|
|
|
|
|
|
|
|
setState(State::FLYING);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const Coordinates& ClassicNote::getCoordinates() const noexcept
|
|
|
|
const Coordinates& ClassicNote::getCoordinates() const noexcept
|
|
|
|