2010-04-04 62 views
2

我正在製作一個通用計時器,它具有從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),則算法倒數悲慘的失敗了。

我知道我可以使用更多的會員和跟蹤以前的時間,等等。這樣做,但我不知道我是否錯過了一些實現,是非常明顯的。我希望在單一操作中儘可能保持簡單。

回答

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

Gah。和我一樣的答案:-( – Yuliy 2010-04-04 23:46:03

+0

好吧,我的目標是不必使用另一個成員的功能。如果是這樣的話,那麼你的第一個塊將無法工作,因爲直接添加時間到m_elapsedTime將需要該函數使用+ =和 - =但是,如果要創建一個單獨的成員是唯一的選擇,那就是我將去 – Person 2010-04-04 23:49:38

+1

這不是一個額外的成員你擺脫m_elapsedTime,並在m_addedTime加入 – Yuliy 2010-04-05 00:19:17

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()`。

此時,問題很明顯:m_elapsedTime的舊值從不影響後續結果。我會考慮添加一個offset字段來處理對定時器起始值的任何更改。此時,計時器:GetElapsedTime可能僅僅是以下幾點:

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

其中偏移量0開始計數,並開始值遞減計數。確保並觀看您的跡象更新抵消AddTime()

+0

一樣。。我上面說過,如果你直接在m_elapsedTime上使用AddTime,那麼你需要爲GetElapsedTime函數使用+ =和 - =。但是,實現一個單獨的成員似乎是一種好的方法。 – Person 2010-04-04 23:51:03