Я делаю общий таймер, который имеет функцию для отсчета от 0 или отсчета с определенного числа. Я также хочу, чтобы позволить пользователю добавлять и вычитать время. Все просто реализовать, за исключением случая, когда таймер отсчитывает от некоторого числа, и пользователь добавляет или вычитает время из него.
Например: (m_clock - это экземпляр часов SFML)
float Timer::GetElapsedTime() {
if ( m_forward ) {
m_elapsedTime += m_clock.GetElapsedTime() - m_elapsedTime;
} else {
m_elapsedTime -=
m_elapsedTime - m_startingTime + m_clock.GetElapsedTime();
}
return m_elapsedTime;
}
Чтобы быть немного более понятным, представьте, что таймер начинает отсчет 100. Через 10 секунд вышеуказанная функция будет выглядеть как 100 -= 100 - 100 + 10
, что равно 90
. Если бы он вызывался через 20 секунд, он выглядел бы как 90 -= 90 - 100 + 30
, что равно 70
.
Это работает для нормального подсчета, но если пользователь вызывает AddTime () (просто m_elapsedTime + = arg), тогда алгоритм обратного отсчета терпит неудачу.
Я знаю, что могу сделать это, используя больше участников и отслеживая предыдущее время и т. Д., Но мне интересно, упускаю ли я какую-то реализацию, которая является чрезвычайно очевидной. Я бы предпочел сделать это как можно более простым в этой единственной операции.