You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java游戏切换至暂停状态时如何停止倒计时器运行?

解决Java游戏暂停后倒计时继续流逝的问题

你的核心问题是倒计时依赖System.currentTimeMillis()与固定startTime的差值计算,暂停期间系统时间仍在推进,导致回到游玩状态时,这个差值包含了暂停时长,最终remainingTime被错误减少。

修复方案

通过记录暂停的时间区间,在恢复游玩时修正startTime,抵消暂停期间的时间流逝:

  1. 添加暂停相关变量
// 记录暂停开始的时间戳
private long pauseStartTime;
// 标记是否处于暂停状态
private boolean isGamePaused = false;
  1. 实现暂停/恢复的状态切换逻辑
// 切换到暂停状态时调用
public void enterPauseState() {
    if (gp.gameState == gp.playState && !isGamePaused) {
        pauseStartTime = System.currentTimeMillis();
        isGamePaused = true;
        gp.gameState = gp.pauseState; // 假设你有对应的暂停状态常量
    }
}

// 从暂停恢复到游玩状态时调用
public void enterPlayState() {
    if (isGamePaused) {
        long pauseDuration = System.currentTimeMillis() - pauseStartTime;
        // 把暂停的时长加到startTime上,让后续的时间差计算自动排除这段时间
        startTime += pauseDuration;
        isGamePaused = false;
        gp.gameState = gp.playState;
    }
}
  1. 保留原倒计时计算逻辑
    原有的remainingTime计算逻辑可以保留,因为我们已经通过修正startTime,确保elapsedTime只计算实际游玩的时长:
// GET ELAPSED TIME
if(gp.gameState == gp.playState && remainingTime >= 0) {
    soundCounter--;
    elapsedTime = System.currentTimeMillis() - startTime;
    remainingTime = totalTime - elapsedTime;
    if(remainingTime <= 0) {
        remainingMilliseconds = 0;
        remainingSeconds = 0;
        remainingMinutes = 0;
        // GAME OVER
        gp.gameOver();
    } else {
        remainingMilliseconds = remainingTime % 1000;
        remainingSeconds = (remainingTime / 1000) % 60;
        remainingMinutes = (remainingTime / 1000) / 60;
    }
}
// DRAW TIMER
timeString = String.format("%02d:%02d:%03d", remainingMinutes, remainingSeconds, remainingMilliseconds);

另一种更直观的实现思路

如果不想依赖startTime,可以直接维护remainingTime,仅在游玩状态时逐帧扣除时间:

private long lastUpdateTime;

// 初始化时调用
public void initTimer() {
    remainingTime = totalTime;
    lastUpdateTime = System.currentTimeMillis();
}

// 在游戏循环中更新倒计时
public void updateTimer() {
    if(gp.gameState != gp.playState || remainingTime <= 0) {
        lastUpdateTime = System.currentTimeMillis(); // 暂停时更新lastUpdateTime,避免恢复时一次性扣减大量时间
        return;
    }
    
    long currentTime = System.currentTimeMillis();
    long timePassed = currentTime - lastUpdateTime;
    lastUpdateTime = currentTime;
    
    remainingTime -= timePassed;
    
    if(remainingTime <= 0) {
        remainingMilliseconds = 0;
        remainingSeconds = 0;
        remainingMinutes = 0;
        gp.gameOver();
    } else {
        remainingMilliseconds = remainingTime % 1000;
        remainingSeconds = (remainingTime / 1000) % 60;
        remainingMinutes = (remainingTime / 1000) / 60;
    }
}

// 绘制计时器逻辑不变
timeString = String.format("%02d:%02d:%03d", remainingMinutes, remainingSeconds, remainingMilliseconds);

这种方式下,暂停状态会直接停止remainingTime的扣减,恢复时从当前剩余时间继续倒计时,逻辑更直观。

内容的提问来源于stack exchange,提问作者numbsku1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:35:16