Как реализовать таймер SpriteKit?

В настоящее время я пытаюсь реализовать таймер для моей спрайтной игры, но я не работаю. Начальное значение таймера всегда остается неизменным.

Я предполагаю, что мне нужно как-то обновить ярлык где-нибудь, но я не знаю, КАК И ГДЕ:? Я не понимаю. Есть идеи?

Вот мой код в моем классе GameScene

    let levelTimerLabel = SKLabelNode(fontNamed: "Chalkduster")
var levelTimerValue: Int  = 500

var levelTimer = NSTimer()

func startLevelTimer() {

    levelTimerLabel.fontColor = SKColor.blackColor()
    levelTimerLabel.fontSize = 40
    levelTimerLabel.position = CGPoint(x: size.width/2, y: size.height/2 + 350)
    addChild(levelTimerLabel)

    levelTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("levelCountdown"), userInfo: nil, repeats: true)

    levelTimerLabel.text = String(levelTimerValue)

}

func levelCountdown(){

    levelTimerValue--

}

Ответ 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")}
}
}

Ответ 2

Похоже, вам нужно обновлять ярлык каждый раз, levelTimerValue изменяется уровень levelTimerValue. Самый простой способ - это нечто подобное.

func levelCountdown(){
    levelTimerValue--
    levelTimerLabel.text = String(levelTimerValue)
}