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

Cannot stop background music from within Game Scenes, Swift 3/Spritekit

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

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

class 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()

非常感谢您的帮助

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

我还会将设置方法和播放方法分开,这样您就不必在每次播放文件时都设置播放器。

例如单例

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()

播放音乐。

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

MusicManager.shared.stop()

有关多轨的功能更丰富的示例,请查看我在 GitHub

上的助手

https://github.com/crashoverride777/SwiftyMusic

希望对您有所帮助