我制造具有功能从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()更新偏移

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top