2014-03-13 196 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