Как приостановить и остановить SKScene без проблем с производительностью?

#swift #xcode #sprite-kit #skscene

#swift #xcode #sprite-kit #skscene

Вопрос:

Я пишу программу, использующую Swift3 в Xcode. Я использую SpriteKit и SKScene в своей программе. Как вы знаете, в gamescene.sks есть предопределенная функция обновления, которая всегда выполняется (даже при изменении представления).

Я знаю, что «self.scene.view.paused = YES;» не работает для функций обновления, которые вызываются всегда.

Есть ли какой-либо способ приостановить и остановить SKScene и его функцию обновления?

Комментарии:

1. О чем вы говорите? View.paused останавливает просмотр от вызова методов обновления spritekits, scene.pause останавливает все дочерние элементы, но обновление все равно происходит

2. @Knight0fDragon вы всегда комментируете мои вопросы, но опять же всегда ничего не говорите. Я спрашиваю, как я могу приостановить / остановить функцию обновления. Другими словами, я говорю, как я могу сделать так, чтобы обновление все еще не происходило. Я знаю, что «self.scene.view.paused = YES;» не останавливает обновление, и я спрашиваю, как это сделать, человек.

3. тогда вы не поняли мой комментарий: «self.scene.view.paused = YES;» Приостанавливает обновление, поэтому я в замешательстве

Ответ №1:

Apple DemoBot — это всегда хороший проект, который стоит проверить.

Лучший способ приостановить вашу игру — создать мировой узел и приостановить этот узел вместо приостановки SKView.

 let worldNode = SKNode()
  

добавьте его в didMoveToView в вашем GameScene.

 addChild(worldNode)
  

Затем добавьте все узлы (или SKActions), которые вы хотите приостановить, в worldNode

 worldNode.addChild(SOMENODE)
worldNode.addChild(SOMENODE2)
  

Чем в вашем методе паузы, который вы говорите

 worldNode.isPaused = true
physicsWorld.speed = 0
  

и в вашем методе возобновления вы говорите

 worldNode.isPaused = false
physicsWorld.speed = 1
  

Чем для метода обновления, вы можете завершить работу раньше, если worldNode приостановлен

 override func update(_ currentTime: TimeInterval) {

     guard !worldNode.isPaused else { return }

     // rest of your code
}
  

Надеюсь, это поможет.