Приостановите все продолжающиеся задержки asyncAfter () в игре SpriteKit - PullRequest
0 голосов
/ 20 декабря 2018

В моей игре метеоры падают с неба.Функция spawnMeteorite вызывается в начале игры и вызывает себя после того, как задержка была удовлетворена, когда новая задержка между метеоритами немного меньше, чем раньше.

func spawnMeteorite(timeInterval:Double) {
    delay(timeInterval) {
        self.spawnMeteorite(timeInterval: timeInterval*0.9)
    }
    // Create meteorites
}

func delay(_ delay:Double, closure:@escaping ()->()) {
    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}

Я успешновозможность приостановить все анимации в моей GameScene с self.view?.isPaused = false.Однако метеоры продолжают появляться, потому что сам код все еще выполняется.

Есть ли способ приостановить все продолжающиеся задержки в моей программе, чтобы, если игра была приостановлена ​​на полпути с 3-секундной задержкой, то при ее возобновлении задержка продолжалась еще 1,5 секунды?Это будет означать, что скорость нереста метеоритов не будет прервана.Спасибо.

1 Ответ

0 голосов
/ 20 декабря 2018

Если вы находитесь внутри класса SKScene, просто запустите сцену в виде SKAction.Действие будет приостановлено и возобновлено, когда вы приостанавливаете / отменяете представление или сцену.

func spawnMeteorite(timeInterval:Double) {

    run(SKAction.wait(forDuration: timeInterval), completion: {
        self.spawnMeteorite(timeInterval: timeInterval * 0.9)
    })

    print("Spawn Meteorite")
}
...