swift - 背景音乐和转场

swift - background music and segues

我目前正在开发一款游戏,该游戏包含三个视图控制器:GameIntroViewController GameViewController GameOverViewController.

每个视图控制器都通过推送链接 segue。使用以下方法...

GameIntroViewController 按钮 -> GameViewController 编程 -> GameOverViewController 按钮 -> GameViewController 等等....

我目前已经将应用程序设置为开始在我的 GameIntroViewController 中播放背景音乐,这很好用,但令人惊讶的是音乐会在每次转场时重新开始,虽然这不是问题我'我希望音乐不要重新开始,而是继续播放,就好像它是一首不受 segues 打断的曲目。

最终我需要在显示 GameOverViewController 时暂停或停止音乐,因为音乐与随后播放的任何视频广告发生冲突。有人知道这样做的最佳方法吗?

考虑一下,如果 GameIntroViewControllerGameViewController 上有不同的音乐,然后 GameOverViewController 上没有音乐,那就太好了。有什么想法可以让我在不让音乐重叠播放的情况下实现这一目标吗?

到目前为止,这是我的代码......(全部在 GameIntroViewController

import AVFoundation

class GameIntroViewController: UIViewController {

var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer()

override func viewDidLoad() {
    super.viewDidLoad()


}


override func viewWillLayoutSubviews() {
    var bgMusicURL:NSURL = NSBundle.mainBundle().URLForResource("bgMusic", withExtension: "m4a")!
    backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: bgMusicURL, error: nil)
    backgroundMusicPlayer.numberOfLoops = -1
    backgroundMusicPlayer.prepareToPlay()
    backgroundMusicPlayer.play()
}

感谢任何可以提供帮助的人...

您当前正在每次初始化新控制器时创建一个新的 AVAudioPlayer 对象:

class GameIntroViewController: UIViewController {
    var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer()
}

您应该使您的 AVAudioPlayer 对象成为全局对象,并设置一次。像这样:

var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer()

class GameIntroViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        var bgMusicURL:NSURL = NSBundle.mainBundle().URLForResource("bgMusic", withExtension: "m4a")!
        backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: bgMusicURL, error: nil)
        backgroundMusicPlayer.numberOfLoops = -1
        backgroundMusicPlayer.prepareToPlay()
        backgroundMusicPlayer.play()
    }
}

同样重要的是要注意:仅在 GameIntroViewController 的 viewDidLoad 中设置一次背景音乐播放器。否则,每当此控制器布局其视图时,它将被重新初始化。如果您在其他控制器中设置此对象,它也会重置该对象。

这种执行此操作的方法还允许您从应用程序的任何位置播放和暂停 backgroundMusicPlayer。

祝你好运,

ZR[=​​12=]

I'd like the music to not restart but continue as if it is one track uninterrupted by segues

由于您希望音乐在视图控制器来来去去时继续播放,因此从您的视图控制器管理音乐是错误的方法。相反,创建一些其他控制器类型的对象来管理音乐(包括音频播放器、要播放的曲目列表等)。在应用程序的早期创建 "music controller" 并将其从一个视图控制器传递到下一个视图控制器,就像传递模型对象一样。也许更好的是,您可以制作曲目列表来播放应用程序数据模型的一部分,这样视图控制器就可以通过与模型交互来影响即将播放的音乐曲目——它们甚至不需要知道音乐控制器。