Позвольте мне предвосхитить этот вопрос, сказав, что я знаю, что его задавали несколько раз, но самый обсуждаемый пост здесь был написан в 2014 году, и верхний ответ, похоже, больше не работает.
Issue
В моей игре все мои «движущиеся» узлы как дети pauseNode
.Когда нажимается кнопка паузы или когда игрок покидает приложение, вызывается pauseScene()
:
func pauseScene() {
self.node.speed = 0
self.physicsWorld.speed = 0
self.node.isPaused = true
}
Это приостанавливает все узлы спрайтов и узлы эмиттера.Это удерживает спрайт-узлы на паузе, если приложение переходит из фонового состояния в состояние переднего плана, но излучатели частиц, похоже, возобновляют анимацию.
Текущее решение
Я решил эту проблему с помощьюсрабатывание pauseScene()
после небольшой задержки, когда приложение стало активным.
override func didMove(to view: SKView) {
NotificationCenter.default.addObserver(self, selector: #selector(GameScene.applicationDidBecomeActive(notification:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: app)
}
@objc func applicationDidBecomeActive(notification: NSNotification) {
NSDelay(0.01) {
pauseScene()
}
}
func NSDelay(_ delay:Double, closure:@escaping ()->()) {
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
Цель
Хотя это решение приостанавливает частицы, оно не идеально, потому что онивидимое движение на долю секунды, необходимое для их повторной паузы (это самая короткая задержка, которая фактически их снова приостанавливает).
Итак, после прочтения поста, на который я ссылался выше, я попытался переопределить applicationDidBecomeActive()
вПодкласс SKView, как было предложено, но я не мог получить метод для вызова.Я хочу, во-первых, не допустить остановки этих частиц, если это возможно.Спасибо