LibGDX 在暂停时停止计时器

3
在LibGdx中,是否有一种方法可以在用户暂停屏幕/暂时离开应用程序(例如来电)时暂停增量时间?例如,当显示消息需要用户花费10秒钟阅读消息时,通常我会获取消息显示的开始时间,在render()中进行计算以获取经过的时间(currentTime - MessageStartedTime),如果经过的时间> 10秒,则关闭消息,一切正常。想象一下这种情况,用户正在阅读消息(假设经过了2秒),一个持续20秒的来电,当进程被带回到我的应用程序时,经过的时间> 10秒,因此即使消息仅显示了2秒,消息也将被删除。
所以,我的问题是,是否有一个主时间计数器可以在我的应用程序中实现这种目的?最好的实现方式是什么?
2个回答

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,则整个游戏都将以双倍速运行。如果您希望这样做的话。

谢谢Steven,这种“主计时器”解决方案正是我正在寻找的,然而,它并不真正起作用,因为deltaTime将获取Gdx.graphics.getDeltaTime()。当活动恢复时,时间仍然会流逝。 - Ziiiii
刚才再看了一下,我确实在恢复后得到了一个很大的delaTime结果。但是我会将游戏保持在暂停状态,直到它开始更新为止,在这个时候,大的deltatime已经被消耗掉了。在resume()函数中,它实际上会显示一个菜单提示玩家恢复游戏。 - Steven Trigg

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;

也许我可以稍微调整一下,使其成为全局主要的增量。谢谢@Chase。 - Ziiiii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接