Держите частицы в сцене, когда приложение становится активным - PullRequest
0 голосов
/ 31 января 2019

Позвольте мне предвосхитить этот вопрос, сказав, что я знаю, что его задавали несколько раз, но самый обсуждаемый пост здесь был написан в 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, как было предложено, но я не мог получить метод для вызова.Я хочу, во-первых, не допустить остановки этих частиц, если это возможно.Спасибо

1 Ответ

0 голосов
/ 02 февраля 2019

Итак, прошло чуть больше дня, и я нашел лучшее решение.В комментарии в этом сообщении предлагалось иметь переменную, которая записывает состояние сцены, и обновлять ее вместе с функциями паузы / воспроизведения:

var sceneIsPaused = false

func pauseScene() {
    self.node.speed = 0
    self.physicsWorld.speed = 0
    self.node.isPaused = true

    sceneIsPaused = true
}

func playScene() {
    self.node.speed = 1
    self.physicsWorld.speed = 1
    self.node.isPaused = false

    sceneIsPaused = false
}

Затем переопределить SKView updateметод и проверить состояние этой переменной.Если сцена должна быть приостановлена, сделайте паузу.Это будет означать, что если сцена автоматически будет приостановлена, она будет повторно приостанавливать следующий кадр.Это намного быстрее и чище, чем установка задержки:

override func update(_ currentTime: TimeInterval) {
    if (sceneIsPaused == true) {
        self.node.speed = 0
        self.physicsWorld.speed = 0
        self.node.isPaused = true
    }
}
...