如何实现SpriteKit计时器



我目前正在尝试为我的精灵套件游戏实现计时器,但我没有让它工作。计时器的初始值始终保持不变。

我假设我需要以某种方式/某处更新标签,但我不知道如何以及在哪里:?我不明白重点。有什么想法吗?

这是我在游戏场景类中的代码

    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--
}

我会坚持在 SpriteKit 中为此类任务SKActions,因为NSTimer不受场景或视图暂停状态的影响,因此可能会导致您遇到麻烦。或者至少,它需要您实现暂停功能,以便在某些情况下暂停计时器,例如当用户暂停场景或接到电话等时。在此处阅读有关 SpriteKit 中与时间相关的操作SKAction vs NSTimer vs GCD 的更多信息。

import SpriteKit
class GameScene: SKScene {
var levelTimerLabel = SKLabelNode(fontNamed: "ArialMT")
//Immediately after leveTimerValue variable is set, update label's 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")}
}
}
听起来每次

更改levelTimerValue时都需要更新标签。最简单的方法是这样。

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

最新更新