時間に追加することができますカウントダウンタイマーのためのアルゴリズム
質問
私は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
ようになります。
は、通常のカウントのためのこの作品は、しかし(ただm_elapsedTime + = argが)その後、後方カウントのためのアルゴリズムが無残に失敗します。
私はなど、より多くのメンバーを使用して、前の回を追跡するこの操作を行うことができます知っているが、私は非常に明白であるいくつかの実装が欠けているかどうか私は思ったんだけど。私は、単一の操作でできるだけ簡単にそれを維持することを好むと思います。
解決
あなたのコードは不必要に複雑です。以下は等価です:
float Timer::GetElapsedTime() {
if ( m_forward ) {
m_elapsedTime = m_clock.GetElapsedTime();
} else {
m_elapsedTime = m_startingTime - m_clock.GetElapsedTime();
}
return m_elapsedTime;
}
AddTime()
はm_elapsedTime
を呼び出すたびに交換されている:GetElapsedTime()
が動作しない理由を、できればとは示しています。最も単純な解決策は、追加/別々に時間を減算し、リワークGetElapsedTime()
従ってトラックである
float Timer::GetElapsedTime() {
float elapsedTime = m_forward
? m_clock.GetElapsedTime()
: m_startingTime - m_clock.GetElapsedTime();
return elapsedTime + m_addedTime;
}
他のヒント
は、あなたがすることによってこれをシミュレートすることができます。の減少の時間量が経過しています。
あなたの算術式は、彼らが必要以上に複雑です:m_elapsedTime += m_clock.GetElapsedTime() - m_elapsedTime
はm_elapsedTime = m_clock.GetElapsedTime()
に相当し、m_elapsedTime -= m_elapsedTime - m_startingTime + m_clock.GetElapsedTime()
はm_elapsedTime = m_startingTimeと同等です - m_clock.GetElapsedTime() `
この時点で、問題が明確である:m_elapsedTimeの古い値は、その後の結果に影響を与えません。私は、タイマーの開始値への変更を処理するためにoffset
フィールドに追加することを検討します。この時点で、タイマー:GetElapsedTimeはちょうど次の可能性があります:
float Timer::GetElapsedTime() {
if ( m_forward ) {
return offset + m_clock.GetElapsedTime();
} else {
return offset - m_clock.GetElapsedTime();
}
}
カウントアップとカウントダウンの開始値を0から開始オフセット。確認し、AddTime()