在LibGdx中,当用户暂停屏幕/离开应用程序暂时(这样的来电)时,有没有办法暂停增量时间?举例来说,当显示消息需要10秒才能让用户阅读消息时,通常情况下,我会将消息显示为开始时间,在render()中进行计算以获取经过的时间(currentTime - MessageStartedTime),如果经过时间> 10秒,然后关闭消息,一切正常,对。对这种情况进行成像,用户正在阅读该消息(假设经过的时间是2秒),一个持续20秒的来电,当该过程被带回我的应用时,经过的时间> 10秒,因此即使消息仅显示2秒,消息也将被删除。
所以,我的问题是,是否有一个主时间计数器,我可以在我的应用程序中实现这种目的?什么是实施它的最佳方式?
答案 0 :(得分:5)
我有两种游戏状态,它们是:
GAME_RUNNING
GAME_PAUSED
调用pause()
后,我将状态设置为GAME_PAUSED
,当调用resume()
时,我将状态设置为GAME_RUNNING
。
然后当我在游戏中运行update()
时,我会检查此状态,如果暂停,我将delta设置为0。
float deltaTime = game.state == GAME_PAUSED ? 0 : Gdx.graphics.getDeltaTime();
这意味着当我的所有游戏对象都更新时,他们的更改会被0乘以并且没有任何变化。我们还可以添加条件,仅在deltaTime > 0
时更新。
如果您有计时器,您将以某种方式更新此计时器:
public void update(World world, float delta) {
frameTimer += delta;
if( frameTimer >= rate / 1000) {
fireAtEnemy(world);
frameTimer = 0;
}
}
因为delta现在为0,所以在GAME_RUNNING
之后游戏将其恢复为resume()
之前,计时器不会增加而不会增加。
此外,您可以添加一个名为GAME_RUNNING_FAST
的额外状态,当设置此状态时,您可以将deltaTime
乘以2。如果您拥有与deltaTime
相关的所有更新,那么您的整个游戏将以双倍速度运行。如果这是你想要的东西。
答案 1 :(得分: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;