我正在制作一个通用计时器,它具有从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),则向后计数的算法会失败。
我知道我可以使用更多成员并跟踪以前的时间等来做到这一点,但我想知道我是否缺少一些非常明显的实现。我希望在单一操作中保持尽可能简单。
答案 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()