GIJoeCodes
GIJoeCodes

Reputation: 1850

Trying to display a resume button after pausing the game scene on SpriteKit

I’m working with Xcode 8 and Swift 3, trying to display a “Resume Game” button on my scene after pausing the game but since everything stops, I have not found a way to properly do so. I followed Mike's advice on this page “Tap To Resume” Pause text SpriteKit, but that didn't help.

When my pause button is tapped, it runs the pause function with the following code:

func pauseGame() {
    self.isPaused = true
    self.physicsWorld.speed = 0
    self.speed = 0.0
    self.scene?.view?.isPaused = true
}

It may seem a little overkill but that works. If I remove

self.scene?.view?.isPaused = true

from my pause function, I'm able to display the tap to Resume Button but I can still interact with some of the SpriteKit nodes in the scene. I'm working on a space shooter game so the user can still move the spceship and tap to fire although the bullets don't travel until I resume the scene.

I thought about adding a boolean "true" to the pause function and adding an IF statement to the firing and the moving above but that seems to me like complicating things a bit.

Any suggestions on how I can display the Resume button when pausing the scene?

Upvotes: 0

Views: 921

Answers (2)

GIJoeCodes
GIJoeCodes

Reputation: 1850

For my next game I'm sure I'll give Nik's suggestion a try. As for my issue above, it worked by using the code shown below. The additional code is to dismiss the pause button as well. Now that this works I can maybe add a fadeIn and fadeOut actions to both buttons.

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch: AnyObject in touches {

        let pointOfTouch = touch.location(in: self)

        let nodeUserTapped = atPoint(pointOfTouch)

        if nodeUserTapped.name == "PauseButton" {
            if (self.isPaused == false) {
                pauseGame()
            }
        }

        if nodeUserTapped.name == "ResumeButton" {
            if (self.isPaused == true) {
                resumeGame()
            }

        }
    }
}


// MARK: - pauseGame
func pauseGame() {
    self.isPaused = true
    currentGameState = gameState.pauseGame
    self.physicsWorld.speed = 0
    self.speed = 0.0
    if (backgroundMusicIsOn == true) {
        backingAudio.stop()
    }
    if resumeButton.isHidden == true {
        resumeButton.isHidden = false
    }
    if pauseButton.isHidden == false {
        pauseButton.isHidden = true
    }
}


// MARK: - resumeGame
func resumeGame() {
    self.isPaused = false
    currentGameState = gameState.inGame
    self.physicsWorld.speed = 1
    self.speed = 1.0
    if (backgroundMusicIsOn == true) {
        backingAudio.play()
    }
    if resumeButton.isHidden == false {
        resumeButton.isHidden = true
    }
    if pauseButton.isHidden == true {
        pauseButton.isHidden = false
    }
}

Upvotes: 1

Nik
Nik

Reputation: 1664

You can't interact with any nodes on your scene because you've paused it entirely, which pauses all its children, which is everything on the scene. To avoid this, pause only certain SKNodes (layers).

Add certain nodes to different SKNodes so instead of pausing the entire scene, you can only pause the the layer (SKNode) that you wish to pause (gameLayer). It would look something like this:

Initialize the nodes

let gameLayer = SKNode() 
let pauseLayer = SKNode()

Now when you want to add a child to the scene, instead add it to the layer that you want it to be a part of:

Add child nodes to the main layers

gameLayer.addChild(gameSceneNode)
pauseLayer.addChild(resumeButton)

Don't forget to add the layers to the scene too

Add the layers to the scene

addChild(gameLayer)
addChild(pauseLayer)

To pause a layer write this:

gameLayer.isPaused = true

Note that in this example, all the nodes on the gameLayer will be paused, however everything on the pauseLayer will not.

Your complete example might look something like this:

func pauseGame() {

    gameLayer.isPaused = true
    pauseLayer.isHidden = false
    gameLayer.physicsWorld.speed = 0
    gameLayer.speed = 0.0

}

func unpauseGame() {

    gameLayer.isPaused = false
    pauseLayer.isHidden = true
    // Whatever else you need to undo

}

Upvotes: 2

Related Questions