将经过的时间转移到另一个 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
}
}
据我了解,您正试图在用户点击停止按钮后保存 watch
的 elapsedTime
。如果是这种情况,在您的 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()
}
如果你的ViewController
class中不需要保存时间,可以在stopButton
函数中将savedTime
变量移动到本地.
我的游戏中有一个小的耗时计时器,它运行良好。但是我想弄清楚如何在你死后保存经过的时间,这样我就可以把它带到显示分数和高分的游戏结束屏幕上。
我厌倦了一些事情,但 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
}
}
据我了解,您正试图在用户点击停止按钮后保存 watch
的 elapsedTime
。如果是这种情况,在您的 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()
}
如果你的ViewController
class中不需要保存时间,可以在stopButton
函数中将savedTime
变量移动到本地.