Xcode Swift 2 Spritekit:游戏未暂停时背景音乐无法恢复的问题

Xcode Swift 2 Spritekit:游戏未暂停时背景音乐无法恢复的问题,xcode,swift,sprite-kit,Xcode,Swift,Sprite Kit,首先,我要提前感谢任何人对我的帮助 我在网上到处搜索,找不到解决问题的办法。我的问题是使用SpriteKit框架构建的iOS游戏。我使用SKAudioNode添加了一首背景歌曲,最初效果很好,但当我暂停并在几秒钟内玩游戏时,音乐不会再次开始播放。我尝试过很多方法,比如在游戏暂停时删除SKAudioNode,在游戏恢复时再次添加它,但都没有效果。我在下面发布了我的代码片段,尽可能保持相关性: class GameScene: SKScene, SKPhysicsContactDelegate {

首先,我要提前感谢任何人对我的帮助

我在网上到处搜索,找不到解决问题的办法。我的问题是使用SpriteKit框架构建的iOS游戏。我使用SKAudioNode添加了一首背景歌曲,最初效果很好,但当我暂停并在几秒钟内玩游戏时,音乐不会再次开始播放。我尝试过很多方法,比如在游戏暂停时删除SKAudioNode,在游戏恢复时再次添加它,但都没有效果。我在下面发布了我的代码片段,尽可能保持相关性:

 class GameScene: SKScene, SKPhysicsContactDelegate {
    var backgroundMusic = SKAudioNode(fileNamed: "bg.mp3")    
    let pauseImage = SKTexture(imageNamed: "pause.png")
    var pauseButton:SKSpriteNode!
    let playImage = SKTexture(imageNamed: "play2.png")
    var playButton:SKSpriteNode!

    override func didMoveToView(view: SKView) {
        self.addChild(backgroundMusic)

        // create pause button
        pauseButton = SKSpriteNode(texture: pauseImage)
        pauseButton.position = CGPoint(x: self.size.width - pauseButton.size.width, y: pauseButton.size.height)
        pauseButton.zPosition = 1
        pauseButton.name = "pauseButton"
        self.addChild(pauseButton)

        // create play button
        playButton = SKSpriteNode(texture: playImage)
        playButton.position = CGPoint(x: self.size.width - playButton.size.width, y: -playButton.size.height)
        playButton.zPosition = 1
        playButton.name = "playButton"
        self.addChild(playButton)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch in touches {
            if pauseButton.containsPoint(touch.locationInNode(self)) {
                let blockOne = SKAction.runBlock({
                    self.pauseButton.position.y = -     self.pauseButton.size.height
                    self.playButton.position.y = self.playButton.size.height
                })

                let blockTwo = SKAction.runBlock({
                    self.view?.paused = true
                })

                self.runAction(SKAction.sequence([blockOne, blockTwo]))
            }
            else if(playButton.containsPoint(touch.locationInNode(self))) {
                self.playButton.position.y = -self.playButton.size.height
                self.pauseButton.position.y = self.pauseButton.size.height
                self.view?.paused = false
            }
        }
    }
}
类游戏场景:SKScene,skphysiccontactdelegate{
var backgroundMusic=SKAudioNode(文件名为:“bg.mp3”)
让pauseImage=SKTexture(图像名为:“pause.png”)
var pauseButton:SKSpriteNode!
让playImage=SKTexture(ImageName:“play2.png”)
var播放按钮:SKSpriteNode!
覆盖func didMoveToView(视图:SKView){
self.addChild(背景音乐)
//创建暂停按钮
pauseButton=SKSpriteNode(纹理:pauseImage)
pauseButton.position=CGPoint(x:self.size.width-pauseButton.size.width,y:pauseButton.size.height)
pauseButton.zPosition=1
pauseButton.name=“pauseButton”
self.addChild(暂停按钮)
//创建播放按钮
playButton=SKSpriteNode(纹理:playImage)
playButton.position=CGPoint(x:self.size.width-playButton.size.width,y:-playButton.size.height)
playButton.zPosition=1
playButton.name=“playButton”
self.addChild(播放按钮)
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
接触{
如果暂停按钮包含点(触摸位置节点(自身)){
让blockOne=SKAction.runBlock({
self.pauseButton.position.y=-self.pauseButton.size.height
self.playButton.position.y=self.playButton.size.height
})
让blockTwo=SKAction.runBlock({
self.view?.paused=true
})
self.runAction(SKAction.sequence([blockOne,blockTwo]))
}
else if(playButton.containsPoint(touch.locationInNode(self))){
self.playButton.position.y=-self.playButton.size.height
self.pauseButton.position.y=self.pauseButton.size.height
self.view?.paused=false
}
}
}
}

您需要研究使用AVAudioPlayer和NSNotificationCenter在游戏中传递数据

在实际的GameViewController类中启动背景音频播放器。 最好这样做,然后使用SKAudioNode。。。这是更多的声音,像声音效果有关的事情发生在游戏中

使用AVAudioPlayer的好处是,当音乐暂停时,它仍然会提示在先前的位置播放

这是无论发生什么事情都会运行的少数事情之一。所以我们把它放在GameViewController中

下面是我们需要开始的GameViewController代码示例

import AVFoundation

var bgMusicPlayer:AVAudioPlayer?
然后在GameViewController中,我们将这些函数设置为

override func viewDidLoad() {



super.viewDidLoad()


// PlayBackgroundSound  , PauseBackgroundSound will be your code to send from other "scenes" to use the audio player //

// NSNotificationCenter to pass data throughout the game //

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameViewController.playBackgroundSound(_:)), name: "PlayBackgroundSound", object: nil)



NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameViewController.pauseBackgroundSound), name: "PauseBackgroundSound", object: nil)

 }

func playBackgroundSound(notification: NSNotification) {


let name = notification.userInfo!["fileToPlay"] as! String



if (bgSoundPlayer != nil){

    bgSoundPlayer!.stop()
    bgSoundPlayer = nil


}

if (name != ""){

    let fileURL:NSURL = NSBundle.mainBundle().URLForResource(name, withExtension: "mp3")!

    do {
        bgSoundPlayer = try AVAudioPlayer(contentsOfURL: fileURL)
    } catch _{
        bgSoundPlayer = nil

    }

    bgSoundPlayer!.volume = 1
    bgSoundPlayer!.numberOfLoops = -1

// -1 will loop it forever // 

    bgSoundPlayer!.prepareToPlay()
    bgSoundPlayer!.play()

   }
 }


func pauseBackgroundSound() {

    if (bgSoundPlayer != nil){

        bgSoundPlayer!.pause()



    }

}
然后,当您想在暂停或恢复按钮功能中使用音频播放器时

请记住,您需要在每个场景中使用播放器

 import AVFoundation.AVAudioSession

 override func didMoveToView(view: SKView) {

     try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

}
如果您想暂停或播放某些内容,请使用NSNotificationCenter

//要在场景中暂停,请在暂停音乐所需的功能中使用这行代码

NSNotificationCenter.defaultCenter().postNotificationName("PauseBackgroundSound", object: self)
NSNotificationCenter.defaultCenter().postNotificationName("PlayBackgroundSound", object: self, userInfo: "FILE NAME OF BACKGROUND MUSIC")
///开始演奏或演奏一首新歌。。在播放音乐所需的功能中使用这行代码

NSNotificationCenter.defaultCenter().postNotificationName("PauseBackgroundSound", object: self)
NSNotificationCenter.defaultCenter().postNotificationName("PlayBackgroundSound", object: self, userInfo: "FILE NAME OF BACKGROUND MUSIC")

非常感谢您花时间回复。我将尝试一下,让你知道它是如何进行的。如果它确实有效,请记住接受答案。这是一个非常详细的答案,所以如果它对你有效的话,很高兴能得到投票和接受。我已经接受了你的答案。抱歉耽搁了,过去几天我一直很忙。您的回答非常有用。有一件事,变量
bgmusiclayer
已设置,稍后在
viewDidLoad
中尝试使用as
bgSoundPlayer
,这是打字错误。正如Corey所建议的,您可以查看AVPlayer的背景音乐。我对SKAudioNodes没有别的意见。他们不能正确地暂停/恢复,他们播放1秒的声音,即使我设置它直到我需要它时才会发出声音,他们也会一直崩溃。