Sprite kit 操作不会等到函数调用结束

Sprite kit 操作不会等到函数调用结束,sprite-kit,skaction,Sprite Kit,Skaction,我把两个动作放在一个序列中。在第一个操作中,我调用一个方法来计算下一个操作的新等待时间。下一个动作只是等待这个持续时间,但第二个动作总是立即执行,因此时间必须为0。我调试了它,在方法中,我得到的时间返回为3.5秒 这是我的两个动作 let spawnFlowerAction = SKAction.run { self.WaitTime = self.calculateWaitingTime() } let waitForNewFlower = SKActi

我把两个动作放在一个序列中。在第一个操作中,我调用一个方法来计算下一个操作的新等待时间。下一个动作只是等待这个持续时间,但第二个动作总是立即执行,因此时间必须为0。我调试了它,在方法中,我得到的时间返回为3.5秒

这是我的两个动作

let spawnFlowerAction = SKAction.run {
            self.WaitTime = self.calculateWaitingTime()
        }
let waitForNewFlower = SKAction.wait(forDuration: self.WaitTime)
我是这样执行的:

        let spawnSeq = SKAction.sequence([spawnFlowerAction, waitForNewFlower])
        let spawnRepeat = SKAction.repeat(spawnSeq, count: 4)
        self.run(spawnRepeat)
结果:4次生成而不等待,在控制台中从calculateWaitingTime函数打印4个不同的计算时间(在其中生成)


解决此问题的好方法是什么?

问题是在创建操作后尝试动态更改SKActions中使用的值。例如,当您的
WaitTime
变量在运行
swakflowerAction
时发生更改时,
waitForNewFlower
操作的等待时间不会动态更改,因为它不引用
WaitTime
。相反,它的等待值是您声明
let waitForNewFlower=SKAction.wait(forDuration:self.WaitTime)
时变量
WaitTime
的值(我猜最初是0)。同样的概念也适用于其他两个繁殖动作

我通常使用调度队列处理类似的事情,但要使用SKActions,这里有一个函数。只需调用它一次,然后输入您希望它重复的次数

func spawnRepeat(count: Int) {

    //Put whatever code to spawn flower here
    print("SPAWN FLOWER")

    if count > 1 {
        //Recalculate WaitTime
        WaitTime = calculateWaitingTime()
        let waitAction = SKAction.wait(forDuration: WaitTime)
        run(waitAction, completion: { self.spawnRepeat(count: count - 1) })
    }
}

我明天会试试这个,如果它有效,我会记下你的答案。非常感谢:)