为什么在update()方法中多次调用runAction()函数?

时间:2016-02-29 05:51:58

标签: swift sprite-kit

在Sprite Kit中的func update(currentTime: CFTimeInterval)方法中,我有一个gameTicker,每次更新游戏时都会增加一个整数。

gameTicker可以被500整除时,我暂停自动收录器,通过移除didMoveToView()中调用的原始操作禁用产生的敌人,并启动一个简短的nextLevelDelayTicker延迟。在nextLevelDelayTicker到达100后,我再次开始递增原始gameTicker,将nextLevelDelayTicker重置为0,然后再次开始生成敌人。

基本上,一旦nextLevelDelayTicker等于100,我只想运行条件一次的内容。我在那里添加了一个print("yolo"),看看当条件满足时它是否只被称为一次,实际上它是。但是,出于某种原因runAction(spawnAction, withKey: "spawnAction")被多次调用。一旦条件self.nextLevelDelayTicker.getTimePassed() == 100得到满足,就会在很短的时间内产生大量的敌人。

如何多次调用runAction(spawnAction, withKey: "spawnAction"),但print("yolo")只被调用一次?

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.removeActionForKey("spawnAction")

        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()

            let spawnAction = SKAction.repeatActionForever(
                SKAction.sequence([
                    SKAction.waitForDuration(2),
                    SKAction.runBlock({
                        [unowned self] in
                        self.spawnEnemy()
                        })
                    ])
            )

            runAction(spawnAction, withKey: "spawnAction")
        }
    }
}

1 个答案:

答案 0 :(得分:0)

事实证明我是渡渡鸟头。 runAction(spawnAction, withKey: "spawnAction")不被多次调用,它是:

if gameTicker.getTimePassed() % 500 == 0 {
     self.enemyAmount += 1
     self.removeActionForKey("spawnAction")

    gameTicker.isActive = false
}

多次被召唤,向self.enemyAmount全局变量添加大量敌人,该变量用于确定在spawnAction运行时产生的敌人数量。

我为条件添加了一个标志,每个级别循环只调用一次,而每个游戏周期只有300次:

if gameTicker.getTimePassed() % 500 == 0 && gameTicker.isActive == true{
    self.enemyAmount += 1
    self.removeActionForKey("spawnAction")

    gameTicker.isActive = false
    print("STOP SPAWNING")
}