SpriteKit - Pause screen doesn't show when didBecomeActive
Asked Answered
S

1

1

My pause system works perfectly from inside the game, and also when the app moves to the background and then becomes active again the game stays paused, but my problem now is when it becomes active my pause screen doesn't show.

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 (My custom 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
        }
}
Schreibe answered 25/10, 2015 at 7:21 Comment(0)
M
1

Setting the pause screen's and button's hidden property has no effect because the view and/or scene is paused. You will need to temporarily un-pause the view, set the hidden properties to false, return the main loop, and then re-pause the view. Here's an example of how to do that.

AppDelegate:

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

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

MainVew (SKView subclass):

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
}

You can toggle between the pause states with

if let customView = self.view as? MyView {
    customView.togglePause()
}
Meandrous answered 27/10, 2015 at 19:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.