LibGDX暂停时停止计时器

时间:2014-03-13 03:36:56

标签: java android time logic libgdx

在LibGdx中,当用户暂停屏幕/离开应用程序暂时(这样的来电)时,有没有办法暂停增量时间?举例来说,当显示消息需要10秒才能让用户阅读消息时,通常情况下,我会将消息显示为开始时间,在render()中进行计算以获取经过的时间(currentTime - MessageStartedTime),如果经过时间> 10秒,然后关闭消息,一切正常,对。对这种情况进行成像,用户正在阅读该消息(假设经过的时间是2秒),一个持续20秒的来电,当该过程被带回我的应用时,经过的时间> 10秒,因此即使消息仅显示2秒,消息也将被删除。

所以,我的问题是,是否有一个主时间计数器,我可以在我的应用程序中实现这种目的?什么是实施它的最佳方式?

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;