действие не ожидает окончания вызова функции - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть 2 действия, которые я положил в последовательности.В первом действии я вызываю метод для расчета нового времени ожидания следующего действия.Следующее действие - просто ожидание этой продолжительности, но второе действие всегда выполняется сразу, поэтому время должно быть 0. Я отладил его, и в методе spawnFlowers я получил время, возвращаемое как 3,5 секунды.

это мои 2 действия

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 раза порождался без ожидания, печатая 4 различных вычисленных времени в консоли из функции CalculayWaitingTime (в котором происходит нерест)

Какой хороший способ это исправить?

1 Ответ

0 голосов
/ 24 ноября 2018

Проблема заключается в попытке динамически изменить значения, используемые в SKActions, после создания действия.Например, когда ваша переменная WaitTime изменяется во время выполнения spawnFlowerAction, время ожидания действия waitForNewFlower не будет изменяться динамически, поскольку оно не ссылается на WaitTime.Вместо этого его значение ожидания будет тем, чем была ваша переменная WaitTime, когда вы объявили let waitForNewFlower = SKAction.wait(forDuration: self.WaitTime) (что, я предполагаю, было изначально 0).То же самое относится и к двум другим вашим действиям spawn.

Я обычно использую Очередь отправки для подобных вещей, но для использования 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) })
    }
}
...