Swift - 背景音乐和转场效果

3
我目前正在开发一个游戏,该游戏由三个视图控制器组成: GameIntroViewControllerGameViewControllerGameOverViewController
每个视图控制器都通过一个推送segue相互链接。使用以下方法... GameIntroViewController按钮 -> 以编程方式进入GameViewController -> GameOverViewController按钮 -> 再次进入GameViewController,以此类推...
我目前已经设置了应用程序在我的GameIntroViewController中开始播放背景音乐,这很好用,但是令人惊讶的是,每次跳转时音乐会重新开始,虽然这不是问题,但我希望音乐不要重新开始,而是像一首不间断的曲子一样继续播放。
最终,当显示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()
}

感谢任何能够提供帮助的人...

2个回答

3

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

class GameIntroViewController: UIViewController {
    var backgroundMusicPlayer:AVAudioPlayer = 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一次。否则,每当该控制器布局其视图时,它都会重新初始化。如果您在其他控制器中设置此对象,它也会重置该对象。

这种做法还允许您从应用程序的任何位置播放和暂停backgroundMusicPlayer。

祝你好运,

ZR


非常感谢,它起作用了!您知道我可以在我的 GameOverViewController 中添加什么来自动静音背景音乐吗? - Rich Townsend
在viewWillAppear方法中,放置以下代码:backgroundMusicPlayer.pause() 或者(要静音)使用 backgroundMusicPlayer.volume = 0。 - zrubenst

0
我希望音乐不要重新开始,而是继续作为一个轨道无缝续接。
由于您希望音乐在视图控制器的出现和消失时继续播放,因此从视图控制器管理音乐是错误的方法。相反,创建一些其他控制器类型对象来管理音乐(包括音频播放器、要播放的曲目列表等)。在应用程序早期创建“音乐控制器”,并将其从一个视图控制器传递到另一个视图控制器,就像传递模型对象一样。甚至更好的是,您可以将要播放的曲目列表作为应用程序的数据模型的一部分,以便视图控制器通过与模型交互来影响即将播放的音乐曲目 - 它们甚至不需要知道音乐控制器的存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接