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

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

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

【问题讨论】:

    标签: java android time logic libgdx


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多