暂停菜单的图层

我正在尝试制作一个暂停菜单 (像这样 ),但是如果我使用相同的图层,当它暂停时我无法与场景交互(我猜?!)。 我到处寻找“暂停菜单”,人们说要用另一层 。 我试着做了一百万次,但它不起作用(或者我可能是那个不知道的人)=(

这就是我到目前为止所做的事情:

**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, 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 } 

我不会暂停现场,你应该像这样创建你的游戏设置

SKScene
–GameNode
—-所有其他游戏相关节点
–OverlayNode
—-你的Pause节点

除了暂停层之外,您拥有的所有节点都进入GameNode所有暂停节点都进入Overlay节点

当您准备暂停场景时,实际上会暂停GameNode。

当您的游戏暂停时,这会使您的场景保持活动状态,因此您可以使用暂停按钮。

当您播放声音时,将它们播放到GameNode内部的节点,而不是场景,这样当您暂停GameNode时,声音会自动暂停

 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 } } 

我认为最好的方法是遵循这个stackoverflow答案 (换句话说使用SKTAudio类 ),你可以在其中声明一个sharedInstance音频库来轻松管理所有音频动作。

有了这个课程,您可以举例说明您的问题:

 var audioManager : SKTAudio = SKTAudio.sharedInstance() self.audioManager.pauseBackgroundMusic() 

我会使用AVAudioPlayer,你可以轻松启动和停止声音。 我从未使用过SKAction.playSoundFileNamed所以我不确定是否可以停止。