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 カウントダウンで始まると想像してください。100 -= 100 - 100 + 10
10 秒後、上記の関数はwhich equalsのようになり90
ます。90 -= 90 - 100 + 30
さらに 20 秒後に呼び出された場合は、 which equalsのようになり70
ます。
これは通常のカウントでは機能しますが、ユーザーが AddTime() (単に m_elapsedTime += arg ) を呼び出すと、後方カウントのアルゴリズムは惨めに失敗します。
より多くのメンバーを使用して以前の時間を追跡するなどしてこれを行うことができることはわかっていますが、非常に明白な実装が欠けているかどうか疑問に思っています。その単一の操作で、できるだけシンプルに保ちたいと思います。