Swift怎么在多个场景的游戏中使用AVAudioPlayer暂停背景音乐?

标签: Swift
发布时间: 2018/1/2 13:55:09
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个背景音乐在我的游戏视图控制器背景中循环。在GameScene中,可以使用暂停音乐按钮,用户可以在那里对游戏音乐进行静音或解音。
我有两个全局变量:

var muteButton = SKSpriteNode(imageNamed: "pause")
var mute: Bool = false

在我的GameScene中,我添加了一些类似于它们的工作(打印响应被触发)。

class GameScene: SKScene{

    override func didMove(to view: SKView){
       ...
        muteButton.position = CGPoint(x: self.size.width*0.2, y: self.size.height*0.90)
        muteButton.name = "Mute Button"
        muteButton.zPosition = 10
        self.addChild(muteButton)
    }

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     for touch: AnyObject in touches{
        let pointOfTouch = touch.location(in: self)
        let nodeITapped = atPoint(pointOfTouch)

        if nodeITapped.name == "Mute Button"{
            if mute == false {
                print("music will now turn OFF")
                mute = true
            }
            else{
                print("music will now turn ON")
                mute = false
            }

         }
      }
   } 
}

我怀疑静音变量只在GameViewController viewDidLoad中被调用一次,因此,if语句只被检查一次。因为我有多个感官连接,所以所有的需要都有音乐播放,最好的地方让我把背景音频放在这里。在我GameViewController:

class GameViewController: UIViewController{

    var backgroundAudio = AVAudioPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Background Audio plays throughout the game
        let filePath = Bundle.main.path(forResource: "Track1",ofType:"mp3")
        let audioNS_URL = NSURL(fileURLWithPath: filePath!)

        if mute == false{
            do{ backgroundAudio = try AVAudioPlayer(contentsOf: audioNS_URL as URL)}
            catch { return print("No Audio Found")}
            // audio will loop forever
            backgroundAudio.numberOfLoops = -1
            backgroundAudio.play()
        }
        else{
            backgroundAudio.pause()
        }
    }
}


解决方法 1:

在GameViewController中添加一个监听:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(switchBackgroundAudio), name: NSNotification.Name.init("switchBackgroundAudio"), object: nil)
    //... other stuff here ...//
}

然后添加一个函数来切换声音:

@objc func switchBackgroundAudio() {
   if mute == false {
     backgroundAudio.play()
   } else {
     backgroundAudio.pause()
   }
}

最后,当你在游戏中触摸到按钮时,你可以启动一个事件:

if nodeITapped.name == "Mute Button"{
  //... stuff here ...//
  NotificationCenter.default.post(Notification(name: NSNotification.Name("switchBackgroundAudio")))
}


赞助商