【问题标题】:swift - background music and seguesswift - 背景音乐和segues
【发布时间】:2019-01-04 22:29:21
【问题描述】:

我目前正在开发一款游戏,该游戏由三个视图控制器组成:GameIntroViewControllerGameViewControllerGameOverViewController

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

GameIntroViewController 按钮 -> GameViewController 以编程方式 -> GameOverViewController 按钮 -> GameViewController 等等....

我目前已将应用程序设置为开始在我的GameIntroViewController 中播放背景音乐,这很好用,但是音乐令人惊讶地随着每个 segue 重新开始,虽然这不是问题我想要音乐不要重新开始,而是继续,就好像它是一首没有被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()
}

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

【问题讨论】:

    标签: ios swift avfoundation playback


    【解决方案1】:

    每次初始化新控制器时,您当前正在创建一个新的 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。否则,每当此控制器布置其视图时,它将重新初始化。如果您在其他控制器中设置此对象,它也会重置该对象。

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

    祝你好运,

    ZR

    【讨论】:

    • 非常感谢您的工作!你知道我可以在GameOverViewController 中添加什么来自动静音背景音乐吗?
    • 在 viewWillAppear 上放置代码:backgroundMusicPlayer.pause() 或(静音)做:backgroundMusicPlayer.volume = 0
    【解决方案2】:

    我希望音乐不要重新开始,而是继续播放,就好像它是一首不间断的曲目

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多