无法阻止游戏场景中的背景音乐,Swift 3 / Spritekit

时间:2016-10-28 01:53:05

标签: swift xcode avfoundation avaudioplayer

在XCODE 8 / Swift 3和Spritekit上,我正在播放背景音乐(一首5分钟的歌曲),从GameViewController的ViewDidLoad(来自所有场景的父节目,而不是来自特定的GameScene)调用它,因为我希望它整个场景变化不停地播放。这没有问题。

但我的问题是,当我在场景中时,我如何随意停止背景音乐?假设用户在第3个场景上获得游戏的特定分数?因为我无法访问父文件的方法。这是我用来调用音乐的代码:

类GameViewController:UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    var audioPlayer = AVAudioPlayer()

    do {
        audioPlayer =  try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "music", ofType: "mp3")!))
        audioPlayer.prepareToPlay()

    } catch {

        print (error)
    }
    audioPlayer.play()

非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

为什么不创建一个可以从任何地方访问的音乐助手类。单例方式或具有静态方法的类。这也应该使您的代码更清晰,更易于管理。

我还会拆分设置方法和播放方法,这样每次播放文件时都不会设置播放器。

例如Singleton

class MusicManager {

    static let shared = MusicManager()

    var audioPlayer = AVAudioPlayer()


    private init() { } // private singleton init


    func setup() {
         do {
            audioPlayer =  try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "music", ofType: "mp3")!))
             audioPlayer.prepareToPlay()

        } catch {
           print (error)
        }
    }


    func play() {
        audioPlayer.play()
    }

    func stop() {
        audioPlayer.stop()
        audioPlayer.currentTime = 0 // I usually reset the song when I stop it. To pause it create another method and call the pause() method on the audioPlayer.
        audioPlayer.prepareToPlay()
    }
}

当您的项目启动时,只需调用设置方法

MusicManager.shared.setup()

比您项目中的任何地方都可以说

MusicManager.shared.play()

播放音乐。

要停止它,只需调用stop方法

MusicManager.shared.stop()

有关具有多个曲目的功能更丰富的示例,请在GitHub上查看我的助手

https://github.com/crashoverride777/SwiftyMusic

希望这有帮助