在XCODE 8/Swift 3和Spritekit上,我正在播放背景音乐(一首5分钟的歌),从GameViewController的ViewDidLoad(从所有场景的父级,而不是从特定的游戏场景)调用它,因为我希望它在整个场景更改过程中不停地播放。这是毫无问题的。
但我的问题是,当我在一个场景中时,我如何随意停止背景音乐?比如说当用户在第三个场景中得到游戏的特定分数时?因为我无法访问父文件的方法。下面是我用来调用音乐播放的代码:
类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()

非常感谢你的帮助

最佳答案

为什么不创建一个可以从任何地方访问的音乐助手类呢。要么是单例方法,要么是一个带有静态方法的类。这也会使代码更干净、更易于管理。
我还将分割设置方法和播放方法,这样每次播放文件时就不会设置播放器。
例如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()
    }
}

当项目启动时,只需调用setup方法
MusicManager.shared.setup()

在你的项目中你可以说
MusicManager.shared.play()

播放音乐。
不要停止,只要调用停止方法
MusicManager.shared.stop()

要获得一个功能更丰富的多轨示例,请查看GitHub上的my helper
https://github.com/crashoverride777/SwiftyMusic
希望这有帮助

关于swift - 无法从游戏场景(Swift 3/Spritekit)中停止背景音乐,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40296793/

10-14 23:35