为什么我的SpriteKit update()函数会创建多个NSTimers?

时间:2016-02-28 05:04:59

标签: ios swift sprite-kit

我正在创建一个基于传递的时间量更新的SpriteKit游戏。该游戏使用NSTimer及其scheduledTimerWithTimeInterval方法生成敌人,每2.0秒调用一次spawnEnemy函数。

当5秒过去时,应该进行非常短暂的间歇,防止新敌人产生以显示等级变化动画。

当达到最初的5秒时,一切正常,直到条件为self.nextLevelDelayTicker == 100。满足此条件后,"YOLO"字符串仅在控制台中触发一次。但是,我假设NSTimer的多个实例正在创建并存储在self.timer中,因为在self.resumeGame()被调用以创建新的计划计时器之后会产生大量的敌人。

关于为什么会发生这种情况的任何想法,即使我在条件设置中设置了标记,只调用一次self.resumeGame()函数?

func resumeGame() {
    // Start game timer
    // Need a way to access ib action of pause button
    self.timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "spawnEnemy", userInfo: nil, repeats: true)
}

override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
    if gameTicker.isActive == true {
        gameTicker.increment()
    }

    // If gameTicker is equal to 5 seconds, increase enemy amount
    if gameTicker.getTimePassed() % 500 == 0 {
        self.enemyAmount += 1
        self.timer?.invalidate()
        levelCount += 1

        gameTicker.isActive = false
    }

    // If level has been completed and last ghost has been killed, activate next level scene
    if gameTicker.isActive == false && enemyArray.count == 0 {
        self.nextLevelDelayTicker.increment()

        if self.nextLevelDelayTicker.getTimePassed() == 100 {
            print("YOLO")
            self.gameTicker.isActive = true
            self.nextLevelDelayTicker.reset()
            self.resumeGame()
        }
    }
}

1 个答案:

答案 0 :(得分:4)

尝试遵循您的代码..但我认为您的方法对于spritekit来说并不是很好。它可能使事情变得比它需要的更复杂。

您可以直接使用更新方法跟踪时间。可能值得重写代码的这一部分。在spritekit中工作得更好,并且不容易出错。

你真正需要的是增量时间。

场景属性

Object.defineProperty(this, 'width', {
    get : function(){
        return this.right - this.left;
    }
});
Object.defineProperty(this, 'height', {
    get: function(){
        return this.bottom - this.top;
    }
})

您的场景的更新方法

// time values
var delta = NSTimeInterval(0)
var last_update_time = NSTimeInterval(0)

// some time youre trying to keep track of
var timeLimit = NSTimeInterval(5)
var timeLimitMax = NSTimeInterval(5)

现在,如果你每隔几秒就会产生一些东西,那么我们甚至不必费心去做 func update(currentTime: NSTimeInterval) { if last_update_time == 0.0 { delta = 0 } else { delta = currentTime - last_update_time } last_update_date = currentTime // now we can keep track of time timeLimit -= self.delta if timeLimit <= 0 { // do something and reset timer timeLimit = timeLimitMax } } 来做这件事。只需将其放入update

即可

现在我们每两秒钟就会运行这段代码。最好的部分是自动暂停和恢复你的游戏。您不必过多地管理SKAction。 spritekit为你做的:)

viewDidLoad