Reputation: 1315
I'm trying to make a pause menu (like this), but if I use the same layer, I can't interact with the scene when it's paused (I guess?!). Everywhere I looked for "pause menu", people said to use another layer. I tried to do it a million times, but it doesn't work (or maybe I'm the one who doesn't know) =(
Thats what I've done so far:
**Declaring**
var gameLayer = SKNode()
var pauseLayer = SKNode()
var gameStarted = Bool()
var Ground = SKSpriteNode()
var Character = SKSpriteNode()
var pauseButton = SKSpriteNode()
var playButton = SKSpriteNode()
**Setup functions**
func setupGround(){
//Ground
Ground = SKSpriteNode(imageNamed: "Ground")
Ground.setScale(0.5)
Ground.position = CGPoint(x: self.frame.width / 2, y: 0)
Ground.zPosition = 1
Ground.physicsBody = SKPhysicsBody(rectangleOfSize: Ground.size)
Ground.physicsBody?.categoryBitMask = PhysicsCategory.Ground
Ground.physicsBody?.collisionBitMask = PhysicsCategory.Character
Ground.physicsBody?.contactTestBitMask = PhysicsCategory.Character
Ground.physicsBody?.affectedByGravity = false
Ground.physicsBody?.dynamic = false
}
func setupCharacter(){
//Character
Character = SKSpriteNode(imageNamed: "Character")
Character.size = CGSize (width: 60, height: 40)
Character.position = CGPoint(x: self.frame.width / 2 - Character.frame.width - 100, y: self.frame.height / 2)
Character.zPosition = 2
Character.physicsBody = SKPhysicsBody(circleOfRadius: Character.frame.height / 2.5)
Character.physicsBody?.categoryBitMask = PhysicsCategory.Character
Character.physicsBody?.collisionBitMask = PhysicsCategory.Ground
Character.physicsBody?.contactTestBitMask = PhysicsCategory.Ground
Character.physicsBody?.affectedByGravity = false
Character.physicsBody?.dynamic = true
Character.physicsBody?.allowsRotation = false
}
func setupPauseButton (){
//Pause
pauseButton = SKSpriteNode (imageNamed: "pause")
pauseButton.setScale(0.25)
pauseButton.position = CGPoint(x: self.frame.width / 10, y: self.frame.height / 1.5)
//pauseButton.zPosition = 3
}
func setupPlayButton(){
//Play
playButton = SKSpriteNode (imageNamed: "play")
playButton.setScale(0.15)
playButton.position = CGPoint(x: self.frame.width / 10, y: self.frame.height / 1.5)
//playButton.zPosition = 3
}
**Creating scene**
func createScene(){
self.physicsWorld.contactDelegate = self
setupGround()
gameLayer.addChild(Ground)
setupCharacter()
gameLayer.addChild(Character)
setupPauseButton()
gameLayer.addChild(pauseButton) //add pauseButton to gameLayer
}
func createPauseLayer(){
setupPlayButton()
pauseLayer.addChild(playButton) //add playButton to pauseLayer
}
override func didMoveToView(view: SKView) {
/* Setup your scene here */
self.addChild(gameLayer)
createScene()
createPauseLayer()
}
**Touches began**
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */
//when touch buttons/screen
for touch in touches {
let location = touch.locationInNode(self)
let node = nodeAtPoint(location)
if node == pauseButton{
pauseState()
}
else if node == playButton{
playState()
}
else {
if gameStarted == false{ //game didn't start yet
gameStarted = true
Character.physicsBody?.affectedByGravity = true //start falling when touch the screen
//first jump
Character.physicsBody?.velocity = CGVectorMake(0, 0)
Character.physicsBody?.applyImpulse(CGVectorMake(0, 15))
//first sound effect
//self.runAction(SKAction.playSoundFileNamed("fly.mp3", waitForCompletion: false))
}
else{
//jump
Character.physicsBody?.velocity = CGVectorMake(0, 0)
Character.physicsBody?.applyImpulse(CGVectorMake(0, 15))
//sound effect
//self.runAction(SKAction.playSoundFileNamed("fly.mp3", waitForCompletion: false))
}
}
}
}
//states
func pauseState(){
pauseButton.hidden = true //hide pauseButton
gameLayer.paused = true //pause gameLayer
self.addChild(pauseLayer) //add pauseLayer
}
func playState(){
pauseButton.hidden = false //show pauseButton
pauseLayer.removeFromParent() //remove pauseLayer
gameLayer.paused = false //unpause gameLayer
}
Upvotes: 3
Views: 650
Reputation: 16827
I would not pause the scene, You should create your game setup like this
SKScene
--GameNode
----All other game related nodes
--OverlayNode
----Your Pause nodes
All the nodes you have besides the pause layer goes into the GameNode All the pause nodes go into the Overlay node
When you are ready to pause your scene, you actually pause your GameNode.
This keeps your scene alive, while your game is paused, so you can use the pause buttons.
When you are playing sounds, play them against nodes inside of the GameNode, not the scene, this way when you pause GameNode, the sounds automatically pause
class GameScene
{
let pauseLayer = SKNode()
let gameLayer = SKNode()
func didMoveToView(view:SKView)
{
self.addChild(gameLayer)
}
func pauseButton()
{
gameLayer.paused = true
self.physicsWorld.speed = 0;
self.addChild(pauseLayer)
}
func unpauseButton()
{
pauseLayer.removeFromParent()
self.physicsWorld.speed = 1;
gameLayer.paused = false
}
}
Upvotes: 4
Reputation: 35392
I think the best way to do it is to follow this stackoverflow answer (in other words to use SKTAudio class) where you can declare a sharedInstance audio library to easily manage all audio actions ..
With this class you can do for example about your question:
var audioManager : SKTAudio = SKTAudio.sharedInstance()
self.audioManager.pauseBackgroundMusic()
Upvotes: 2
Reputation: 3459
I would use AVAudioPlayer, you can start and stop sounds easily. I've never used SKAction.playSoundFileNamed so I'm not sure if it's possible to stop.
Upvotes: 0