算法倒计时定时器可在一次添加
题
我制造具有功能从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()
更新偏移