Экран SpriteKit - Пауза не отображается, когда didBecomeActive

Моя система паузы отлично работает изнутри игры, а также когда приложение перемещается на задний план, а затем снова становится активным, игра остается приостановленной, но теперь моя проблема заключается в том, когда она активируется, мой экран паузы не отображается.

AppDelegate:

func applicationDidBecomeActive(application: UIApplication) {
 NSNotificationCenter.defaultCenter().postNotificationName("Pause", object: nil)
}

ViewController:

override func viewDidLoad() {
 super.viewDidLoad()
 let scene = GameScene()
 // Configure the view.
 let skView = self.view as! MainView
 NSNotificationCenter.defaultCenter().addObserver(skView, selector: "setStayPaused", name: "Pause", object: nil)
 skView.ignoresSiblingOrder = true
 scene.scaleMode = .AspectFill
 scene.size = skView.bounds.size
 skView.presentScene(scene)
 }

MainView (Мой пользовательский skView):

class MainView: SKView {
 var stayPaused = false as Bool
 override var paused: Bool {
 get {
 return super.paused
 }
 set {
 if (!stayPaused) {
 super.paused = newValue
 }
 stayPaused = false
 }
 }
 func setStayPaused() {
 if (super.paused) {
 self.stayPaused = true
 }
 }
}

GameScene:

override func didMoveToView(view: SKView) {
 NSNotificationCenter.defaultCenter().addObserver(self, selector: "pauseGame", name: "Pause", object: nil)
}
func pauseGame() {
 if isFirstTime == false { // to make sure that the app did not just get launched
 pauseScreen.hidden = false // doesn't show
 pauseButton.hidden = false // doesn't show
 view?.paused = true
 scene?.paused = true
 }
}
1 ответ

Настройка экрана паузы и скрытого свойства кнопки не влияет, потому что просмотр и/или сцена приостановлены. Вам необходимо временно приостановить просмотр, установить скрытые свойства в false, вернуть основной цикл и затем снова приостановить просмотр. Вот пример того, как это сделать.

AppDelegate:

func applicationWillResignActive(application: UIApplication) { 
 NSNotificationCenter.defaultCenter().postNotificationName("PauseViewNotification", object:nil)
}
func applicationDidBecomeActive(application: UIApplication) {
 NSNotificationCenter.defaultCenter().postNotificationName("ShowPauseScreenNotification", object:nil)
}

MainVew (подкласс SKView):

class MainView: SKView {
 override var paused: Bool {
 get {
 return super.paused
 }
 set {
 }
 }
 func pause() {
 super.paused = true
 }
 func resume() {
 super.paused = false
 }
 func togglePause() {
 super.paused = !super.paused
 }
}

ViewController:

override func viewDidLoad() {
 super.viewDidLoad()
 if let scene = GameScene(fileNamed:"GameScene") {
 // Configure the view.
 let skView = self.view as! MainView
 NSNotificationCenter.defaultCenter().addObserver(skView, selector:Selector("pause"), name: "PauseViewNotification", object: nil)
 }
}

GameScene:

override func didMoveToView(view: SKView) {
 NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector("pauseGame"), name: "ShowPauseScreenNotification", object: nil)
}
func pauseGame() {
 if (!isFirstTime) {
 pauseScreen.hidden = false
 pauseButton.hidden = false
 // Un-pause the view so the screen and button appear
 if let customView = self.view as? MainView {
 customView.resume()
 }
 // Re-pause the view after returning to the main loop
 let pauseAction = SKAction.runBlock({
 [weak self] in
 if let customView = self?.view as? MainView {
 customView.pause()
 }
 })
 runAction(pauseAction)
 }
 isFirstTime = false
}

Вы можете переключаться между состояниями паузы с помощью

if let customView = self.view as? MyView {
 customView.togglePause()
}

licensed under cc by-sa 3.0 with attribution.