将经过的时间转移到另一个 ViewController

Carrying Elapsed Time over to another ViewController

我的游戏中有一个小的耗时计时器,它运行良好。但是我想弄清楚如何在你死后保存经过的时间,这样我就可以把它带到显示分数和高分的游戏结束屏幕上。

我厌倦了一些事情,但 none 似乎有效。我想这是因为当游戏结束时时间并没有保存在任何地方,而是在游戏重新开始时重置为 00:00:00。

我为此计时器使用了两个视图控制器。一个叫做 Stopwatch,另一个代码在 GameScene 中。这是代码。

我想把它放入标签中,例如:

    let timeLabel = SKLabelNode(fontNamed: "Planer")
    timeLabel.text = "Time: \(savedTimer)"
    timeLabel.fontSize = 100
    timeLabel.fontColor = SKColor.white
    timeLabel.zPosition = 2
    timeLabel.position = CGPoint (x: self.size.width/2, y: self.size.height * 0.5)
    self.addChild(timeLabel)*/

Stopwatch.swift代码

import Foundation

class Stopwatch {

private var startTime : Date?

var elapsedTime: TimeInterval {
    if let startTime = self.startTime {
        return -startTime.timeIntervalSinceNow
    } else {
        return 0
    }
}
var isRunning: Bool {
    return startTime != nil
}

func start() {
    startTime = Date()
}

func stop() {
    startTime = nil
}
}

我通过我的游戏场景获得的代码速度:

import UIKit

class ViewController: UIViewController {

private let formatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "mm:ss:SS"
    return formatter
}()

let watch = Stopwatch()

@IBOutlet weak var elapsedTimeLabel: UILabel!

@IBAction func startButton(_ sender: Any) {
    Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.updateElapsedTimeLabel), userInfo: nil, repeats: true)

    watch.start()
}

@IBAction func stopButton(_ sender: Any) {
    watch.stop()
}

@objc func updateElapsedTimeLabel (timer : Timer) {
    if watch.isRunning {
        elapsedTimeLabel.text = formatter.string(from: Date(timeIntervalSince1970: watch.elapsedTime))
    } else {
        timer.invalidate()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
}

override var prefersStatusBarHidden: Bool {
    return true
}
}

据我了解,您正试图在用户点击停止按钮后保存 watchelapsedTime。如果是这种情况,在您的 stopButton 函数中您将调用 watch.stop(),这又会重置 startTime = nil。所以你可能想像这样编辑它:

// Create a new class variable to store the time
var savedTime: TimeInterval? = nil

@IBAction func stopButton(_ sender: Any) {
    savedTime = watch.elapsedTime
    //    Use the savedTime here to pass to the game over function
    watch.stop()
}

如果你的ViewControllerclass中不需要保存时间,可以在stopButton函数中将savedTime变量移动到本地.