Я создаю общий таймер, который имеет функциональные возможности для подсчета от 0 или обратного отсчета от определенного числа. Я также хочу, чтобы он позволял пользователю добавлять и вычитать время. Все просто реализовать, за исключением случая, когда таймер отсчитывает от некоторого числа, и пользователь добавляет или вычитает из него время.Алгоритм таймера обратного отсчета, который можно добавить вовремя
Например: (m_clock является экземпляром 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), то алгоритм для обратного счета терпит неудачу.
Я знаю, что могу сделать это, используя большее количество участников и отслеживая предыдущие времена и т. Д., Но мне интересно, не хватает ли я какой-то реализации, которая очень очевидна. Я бы предпочел максимально упростить эту операцию.
Gah. тот же ответ, что и я :-( – Yuliy
Ну, моя цель заключалась в том, чтобы не использовать другой элемент для этой функции. Если это так, то ваш первый блок не будет работать, потому что добавление времени непосредственно в m_elapsedTime потребует использования этой функции + = и - =. Однако если создание отдельного элемента является единственным вариантом, то это то, с чем я буду работать. – Person
Это не дополнительный член. Вы избавляетесь от m_elapsedTime и добавляете в m_addedTime. – Yuliy