How to implement a SpriteKit timer?

前端 未结 2 559
失恋的感觉
失恋的感觉 2021-02-04 09:46

I am currently trying to implement a timer for my sprite kit game, but I don\'t get it working. The initial value of the timer always remains the same.

I am assuming I n

相关标签:
2条回答
  • 2021-02-04 10:00

    Sounds like you need to update the label everytime levelTimerValue is changed. The easiest way would be something like this.

    func levelCountdown(){
        levelTimerValue--
        levelTimerLabel.text = String(levelTimerValue)
    }
    
    0 讨论(0)
  • 2021-02-04 10:08

    I would stick to SKActions for these kind of tasks in SpriteKit due to fact that NSTimer is not affected by scene's, or view's paused state, so it might lead you into troubles. Or at least, it will require from you to implement a pause feature in order to pause your timers in certain situations, like when user pause the scene, or receive a phone call etc. Read more here about SKAction vs NSTimer vs GCD for time related actions in SpriteKit.

    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")}
    }
    }
    
    0 讨论(0)
提交回复
热议问题