Java游戏切换至暂停状态时如何停止倒计时器运行?
解决Java游戏暂停后倒计时继续流逝的问题
你的核心问题是倒计时依赖System.currentTimeMillis()与固定startTime的差值计算,暂停期间系统时间仍在推进,导致回到游玩状态时,这个差值包含了暂停时长,最终remainingTime被错误减少。
修复方案
通过记录暂停的时间区间,在恢复游玩时修正startTime,抵消暂停期间的时间流逝:
- 添加暂停相关变量
// 记录暂停开始的时间戳 private long pauseStartTime; // 标记是否处于暂停状态 private boolean isGamePaused = false;
- 实现暂停/恢复的状态切换逻辑
// 切换到暂停状态时调用 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; } }
- 保留原倒计时计算逻辑
原有的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
相关产品推荐
相关产品推荐

