运行 以无限期递减的间隔等待操作的函数

Function to run a wait action at decreasing intervals indefinitely

我有代码,其中 运行 是持续 columnTime 的等待操作,然后是 运行 代码块。这导致阻塞 运行ning 一次,然后等待时间,然后阻塞,然后等待时间,等等

func startSpawning(){
    print(columnTime)
    let wait = SKAction.waitForDuration(columnTime)
    let block = SKAction.runBlock({[unowned self] in self.spawnObstacle()})
    let sequence = SKAction.sequence([wait, block])
    runAction(SKAction.repeatActionForever(sequence), withKey: "spawning")
} //startSpawning

我想要以下内容:等待 5 秒,运行 块代码将列时间减少到 4.95 秒,运行 等待 4.95 秒,运行 块代码减少等待时间到 4.90 秒,运行 等待 4.90 秒,等等

我尝试了以下操作,但它 运行 一遍又一遍地执行每个操作,没有任何等待。我的输出充满了来自等待和块代码块的打印语句。

func startSpawning(){
    let wait = SKAction.runBlock({[unowned self] in self.waitFunc()})
    let block = SKAction.runBlock({[unowned self] in self.spawnObstacle()})
    let sequence = SKAction.sequence([wait, block])
    runAction(SKAction.repeatActionForever(sequence), withKey: "spawning")
} //startSpawning
func waitFunc() -> SKAction{
    print("running wait func")
    return SKAction.waitForDuration(getColumnTime())
}
func getColumnTime() -> NSTimeInterval {
    return columnTime
}

您不了解变量的工作原理,一旦您将等待分配给序列,就是这样。序列将始终是创建时分配的任何内容。创建一个新实例并不能解决这个问题,因为旧实例仍在序列中。每次 运行 通过序列时,您都需要产生一组新的动作,而不是重复动作:

var columnTime : NSTimeInterval = 10

func startSpawning(){
    let wait = SKAction.waitForDuration(columnTime)
    let block = SKAction.runBlock()
                {
                    [unowned self] in 
                    columnTime -= 0.1
                    self.spawnObstacle()
                    self.startSpawning()
                }
     let sequence = SKAction.sequence([wait, block])
     removeActionForKey("spawning")
     runAction(sequence, withKey: "spawning")
}