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

如何将游戏计时器耗时传递至Game Over界面ViewController

嘿,我来帮你搞定这个游戏计时器的问题~看起来核心问题就是角色死亡时没及时把当前耗时存下来,导致切到Game Over界面时数据直接重置了。针对你用Stopwatch和Game Over界面两个ViewController的场景,给你几个实用的解决思路:

解决游戏计时器在Game Over界面的传递与保存问题

方案1:界面跳转时直接传值(最直接)

这是VC间传数据的常规操作,关键是在角色死亡的瞬间先把计时器暂停并抓下当前值:

  1. 先在你的Game Over界面VC里加个接收耗时的属性:
// Swift示例,OC逻辑完全一致
var finalElapsedTime: TimeInterval = 0.0
  1. 在Stopwatch VC里,检测到角色死亡时,立刻暂停计时器、获取当前耗时,再给Game Over VC赋值后跳转:
// 先停计时器,避免时间继续走
stopwatchTimer.invalidate()
// 假设你用elapsedTime存当前已跑的时间
let currentTime = elapsedTime
// 初始化Game Over界面
let gameOverVC = GameOverViewController()
gameOverVC.finalElapsedTime = currentTime
// 按你的导航方式跳转,push或者present都行
navigationController?.pushViewController(gameOverVC, animated: true)
  1. 最后在Game Over VC里,把finalElapsedTime转成00:00:00的格式显示就好。

方案2:用单例做全局状态管理(适合多界面共享)

如果后续还有其他界面要用到计时器状态,单例会更省心,不用来回传值:

  1. 写个单例类专门管计时器:
class GameTimerManager {
    // 单例实例,全局唯一
    static let shared = GameTimerManager()
    private init() {}
    
    // 存当前耗时
    var elapsedTime: TimeInterval = 0.0
    // 计时器对象
    var timer: Timer?
    
    // 启动计时器
    func startTimer() {
        timer?.invalidate()
        timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { [weak self] _ in
            self?.elapsedTime += 0.1
        }
    }
    
    // 暂停并保存当前时间
    func pauseTimer() {
        timer?.invalidate()
        // elapsedTime自动保留当前值,不用额外存
    }
    
    // 重置计时器
    func resetTimer() {
        elapsedTime = 0.0
        timer?.invalidate()
    }
}
  1. 在Stopwatch VC里启动计时器时,直接用单例:
GameTimerManager.shared.startTimer()
  1. 角色死亡时,调用暂停:
GameTimerManager.shared.pauseTimer()
  1. 到Game Over VC里直接拿值就行:
let finalTime = GameTimerManager.shared.elapsedTime
// 转格式显示

方案3:用UserDefaults临时存储(怕重启丢失的话用这个)

如果担心游戏重启(比如从Game Over界面回到游戏主菜单再开新局)还能拿到上次的耗时,用UserDefaults临时存一下:

  1. 角色死亡时存值:
// 把当前耗时存到UserDefaults
UserDefaults.standard.set(elapsedTime, forKey: "LastGameElapsedTime")
  1. 在Game Over VC里读取:
let finalTime = UserDefaults.standard.double(forKey: "LastGameElapsedTime")
// 显示完记得删掉,不然下次会读到旧数据
UserDefaults.standard.removeObject(forKey: "LastGameElapsedTime")

关键提醒!

一定要在角色死亡的第一时间暂停计时器并保存值,别等界面跳转完再处理——不然可能因为Stopwatch VC被销毁,计时器数据直接没了,或者计时器还在偷偷跑,导致时间不准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:06:33