LibGDX 暂停时停止时间计数器

Posted

技术标签:

【中文标题】LibGDX 暂停时停止时间计数器【英文标题】:LibGDX stop time counter on pause 【发布时间】:2014-04-17 14:14:29 【问题描述】:

在 LibGdx 中,当用户暂时暂停屏幕/离开应用程序(例如来电)时,有没有办法暂停增量时间?举个例子,当显示消息需要 10 秒让用户阅读消息时,通常我会得到消息显示的开始时间,在 render() 中计算得到经过的时间(currentTime - MessageStartedTime),如果经过时间> 10秒,然后关闭消息,一切正常,对。想象这种情况,用户正在阅读消息(假设经过时间为 2 秒),来电花费了 20 秒,当进程返回到我的应用程序时,经过的时间 > 10 秒,因此消息将是即使消息仅显示 2 秒,也已删除。

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

【问题讨论】:

【参考方案1】:

我有两种游戏状态,它们是:

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,所以计时器不会增加,也不会增加,直到游戏状态在 resume() 之后回到 GAME_RUNNING

此外,您可以添加一个名为 GAME_RUNNING_FAST 的额外状态,当设置此状态时,您可以将 deltaTime 乘以 2。如果您拥有与deltaTime 相关的所有更新,那么您的整个游戏将以双倍速度运行。如果这是你想要的。

【讨论】:

感谢 Steven,这是我正在寻找的一种“主计时器”解决方案,但是,由于 deltaTime 将获取 Gdx.graphics.getDeltaTime(),因此它并没有真正起作用。当活动恢复时,时间仍然会过去。 再看一遍,我确实从恢复时得到了很大的延迟时间结果。但是,我让游戏处于暂停状态,直到它再次开始更新,此时已经消耗了大的增量时间。在 resume() 上,它实际上显示了一个提示玩家继续游戏的菜单。【参考方案2】:
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

以上是关于LibGDX 暂停时停止时间计数器的主要内容,如果未能解决你的问题,请参考以下文章

西门子plc暂停程序 西门子plc200如何实现让程序在突然断电,再送电时继续停止前的程序运行

如何在使用 Segger J-link pro 和 Stm32cubeIDE 进行调试期间暂停看门狗计数器

MPNowPlayingInfoCenter - 当音频暂停时,经过的时间不断计数

LibGDX - 渲染愤怒的小鸟风格动画分数计数器

Libgdx 播放/暂停音乐

Android 如何在阅读列表项计数时停止包含页脚行的 TalkBack