時間に追加することができますカウントダウンタイマーのためのアルゴリズム

StackOverflow https://stackoverflow.com/questions/2576251

質問

私は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が)その後、後方カウントのためのアルゴリズムが無残に失敗します。

私はなど、より多くのメンバーを使用して、前の回を追跡するこの操作を行うことができます知っているが、私は非常に明白であるいくつかの実装が欠けているかどうか私は思ったんだけど。私は、単一の操作でできるだけ簡単にそれを維持することを好むと思います。

役に立ちましたか?

解決

あなたのコードは不必要に複雑です。以下は等価です:

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_elapsedTimem_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()

のオフセット更新のためのあなたの兆候を見て
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top