倒计时器的算法,可以按时添加

时间:2010-04-04 23:22:37

标签: c++ algorithm timer countdown sfml

我正在制作一个通用计时器,它具有从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),则向后计数的算法会失败。

我知道我可以使用更多成员并跟踪以前的时间等来做到这一点,但我想知道我是否缺少一些非常明显的实现。我希望在单一操作中保持尽可能简单。

2 个答案:

答案 0 :(得分:3)

您的代码不必要地复杂。以下是等效的:

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;
}

答案 1 :(得分:1)

如果你想增加剩余时间,你可以通过减少经过的时间来模拟它。

你的算术表达式比它们需要的更复杂: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()`。< / p>

此时,问题很明显:m_elapsedTime的旧值永远不会影响后续结果。我会考虑在offset字段中添加以处理对计时器起始值的任何更改。此时,Timer:GetElapsedTime可能就是以下内容:

float Timer::GetElapsedTime() {
  if ( m_forward ) {
    return offset + m_clock.GetElapsedTime();
  } else {
    return offset - m_clock.GetElapsedTime();
  }
}

其中,偏移量从0开始,用于递增计数,起始值用于递减计数。确保并在AddTime()

中注意更新偏移的标志