Это один из тех редких случаев, когда вы хотите использовать Timer
.
let date = Date().addingTimeInterval(5)
let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(runCode), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: .common)
Это потому, что вы зависите от реального времени, а не от игрового времени.
Имейте в виду, что вам нужно отслеживать любые пропуски зажигания из таймера, потому что вы выключеныделать другие вещи.Ваша функция runCode
должна ссылаться на делегатов обновляемых вами сцен, а также не должна увеличиваться.Вместо этого он должен проверять, когда ваш код в последний раз срабатывал, и сравнивать его с текущим временем, когда ваш код сработал, чтобы определить, сколько точек нужно добавить.Он должен вести себя точно так же, как и код, который вы используете при выходе и возвращении в приложение.
Теперь, если вам необходимо выполнить какие-либо обновления пользовательского интерфейса, я бы предложил подключить его к SKAction, который вы прикрепляете к сцене.Таким образом, если ваша сцена находится в состоянии паузы или не загружена, она будет срабатывать при возобновлении сцены.Это также гарантирует, что ваши изменения пользовательского интерфейса выполняются в основном потоке, в отличие от того, в каком потоке ваш таймер может быть.
Теперь, в зависимости от того, как вы разрабатываете свою игру, я бы рекомендовал другой подход.Если у вас есть несколько сцен с одинаковым наложением, я бы порекомендовал наложение даже не быть частью SpriteKit.Вместо этого создайте слой UIView, который лежит поверх ваших сцен SpriteKit.Это представление использует узлы, которые не нужно обновлять каждый кадр за пределами вашей сцены, что позволяет вашей сцене работать быстрее, так как она должна рендерить, сортировать и фильтровать между меньшим количеством узлов.Кроме того, вам нужно обновить только 1 вид, а не количество сцен X.