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 进行调试期间暂停看门狗计数器