Ответ 1
Я бы придерживался SKActions
для таких задач в SpriteKit из-за того, что NSTimer
не зависит от состояния сцены или просмотра в режиме паузы, поэтому это может привести к неприятностям. Или, по крайней мере, вам понадобится реализовать функцию паузы, чтобы приостановить ваши таймеры в определенных ситуациях, например, когда пользователь приостанавливает сцену или получает телефонный звонок и т.д. Подробнее читайте здесь о SKAction
vs NSTimer
vs GCD
для связанных с временем действия в SpriteKit.
import SpriteKit
class GameScene: SKScene {
var levelTimerLabel = SKLabelNode(fontNamed: "ArialMT")
//Immediately after leveTimerValue variable is set, update label text
var levelTimerValue: Int = 500 {
didSet {
levelTimerLabel.text = "Time left: \(levelTimerValue)"
}
}
override func didMoveToView(view: SKView) {
levelTimerLabel.fontColor = SKColor.blackColor()
levelTimerLabel.fontSize = 40
levelTimerLabel.position = CGPoint(x: size.width/2, y: size.height/2 + 350)
levelTimerLabel.text = "Time left: \(levelTimerValue)"
addChild(levelTimerLabel)
let wait = SKAction.waitForDuration(0.5) //change countdown speed here
let block = SKAction.runBlock({
[unowned self] in
if self.levelTimerValue > 0{
self.levelTimerValue--
}else{
self.removeActionForKey("countdown")
}
})
let sequence = SKAction.sequence([wait,block])
runAction(SKAction.repeatActionForever(sequence), withKey: "countdown")
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
//Stop the countdown action
if actionForKey("countdown") != nil {removeActionForKey("countdown")}
}
}