forked from NaiJi/project-kyoku
59 lines
1.3 KiB
C++
59 lines
1.3 KiB
C++
#include "note.h"
|
|
#include <cmath>
|
|
|
|
Note::Note(microsec offset, microsec life_span_offset, Note::Arrow type) :
|
|
_offset(offset),
|
|
_start_handling_offset(_offset + life_span_offset),
|
|
_end_handling_offset(_offset - life_span_offset),
|
|
_type(type)
|
|
{}
|
|
|
|
void Note::setPosition(coordinates position)
|
|
{
|
|
_position = position;
|
|
}
|
|
|
|
coordinates Note::position() const noexcept
|
|
{
|
|
return _position;
|
|
}
|
|
|
|
microsec Note::offset() const noexcept
|
|
{
|
|
return _offset;
|
|
}
|
|
|
|
NoteGrade Note::onTap(Arrow arrow_type, microsec tap_time_stamp) const
|
|
{
|
|
if (arrow_type != _type)
|
|
return {0, NoteGrade::Rating::WRONG};
|
|
|
|
microsec odds = std::abs(tap_time_stamp - _offset);
|
|
return calculatePrecision(odds);
|
|
}
|
|
|
|
NoteGrade Note::calculatePrecision(microsec odds) const
|
|
{
|
|
NoteGrade ret(0, NoteGrade::Rating::BAD);
|
|
|
|
if (odds < _precision_qualifier)
|
|
{
|
|
ret = {50, NoteGrade::Rating::GREAT};
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
bool Note::isActive(microsec music_play_offset) const noexcept
|
|
{
|
|
return music_play_offset > _start_handling_offset
|
|
&& music_play_offset < _end_handling_offset;
|
|
}
|
|
|
|
void Note::setPrecisionQualifier(microsec qualifier)
|
|
{
|
|
_precision_qualifier = qualifier;
|
|
}
|
|
|
|
microsec Note::_precision_qualifier = 500000; // Default initialization as 0.5 second.
|