2014-03-13 197 views
3

在LibGdx中,當用戶暫時暫停屏幕/左側應用(例如來話呼叫)時,是否有辦法暫停增量時間?舉例來說,當顯示消息將要用10秒來讀取消息時,通常我會得到消息顯示的開始時間,在render()中進行計算以獲取消逝的時間(currentTime - MessageStartedTime),if經過時間> 10秒,然後關閉消息,一切正常,對。在這種情況下,用戶正在閱讀郵件(假設經過時間爲2秒),撥打電話的時間爲20秒,當過程返回到我的應用時,所用時間超過10秒,因此郵件將爲即使該消息僅顯示2秒鐘,也會被刪除。LibGDX停止時間計數器暫停

所以,我的問題是,是否有一個主時間計數器,我可以在我的應用程序中實現這種目的?以及實施它的最佳方式是什麼?

回答

5

我有兩個遊戲狀態,它們分別是:

GAME_RUNNING 
GAME_PAUSED 

pause()被稱爲我的狀態設置爲GAME_PAUSEDresume()是叫我把狀態設置爲GAME_RUNNING

,然後當我在我的遊戲運行update()我檢查這個狀態,如果它的暫停我設置增量爲0

float deltaTime = game.state == GAME_PAUSED ? 0 : Gdx.graphics.getDeltaTime(); 

這意味着,當我所有的遊戲對象更新,其變化是由0 multipled和沒有什麼變化。我們還可以添加一個條件,只有在deltaTime > 0時纔會更新。

如果你有一個計時器,你會更新這個計時器莫名其妙地想:

public void update(World world, float delta) { 
    frameTimer += delta; 

    if(frameTimer >= rate/1000) { 
     fireAtEnemy(world); 
     frameTimer = 0; 
    } 
} 

因爲現在增量爲0,定時器將不增加,resume()後,直到比賽狀態時,它不會增加回GAME_RUNNING

此外,您可以添加一個名爲類似GAME_RUNNING_FAST的額外狀態,並且在設置此狀態時,可以將deltaTime乘以2。如果您的所有更新都與deltaTime相關,那麼您的整個遊戲將以雙倍速度運行。如果那是你想要的東西。

+0

謝謝史蒂文,這是一種「主計時器」解決方案是我正在尋找的東西,但是,它並沒有真正的工作,因爲deltaTime會得到Gdx.graphics.getDeltaTime()。活動重新開始後,時間依然會過去。 – Ziiiii

+0

只是再看一次,我從恢復時就得到了大量的delaTime結果。然而,我將遊戲置於暫停狀態,直到它開始再次更新,此時消耗了大量的時間。在resume()上它實際上顯示一個菜單,提示玩家恢復遊戲。 –

1
private long pauseTime = 0; 
private long pauseDelay = 0; 
@Override 
public void pause() { 
    pauseTime = System.nanoTime(); 

} 

@Override 
public void resume() { 
    pauseDelay = System.nanoTime() - pauseTime; 
    pauseTime = 0; 
} 

而在你render方法,你只是做long displayTime = delta - pauseDelay; pauseDelay = 0;

+0

這是一個很好的解決方案,如果我只需要它的1個項目 – Ziiiii

+0

可能我可以調整它有點讓它成爲一個全球主Delta,謝謝@Chase – Ziiiii