swift - 背景音乐和转场
swift - background music and segues
我目前正在开发一款游戏,该游戏包含三个视图控制器:GameIntroViewController
GameViewController
GameOverViewController
.
每个视图控制器都通过推送链接 segue
。使用以下方法...
GameIntroViewController
按钮 -> GameViewController
编程 -> GameOverViewController
按钮 -> GameViewController
等等....
我目前已经将应用程序设置为开始在我的 GameIntroViewController
中播放背景音乐,这很好用,但令人惊讶的是音乐会在每次转场时重新开始,虽然这不是问题我'我希望音乐不要重新开始,而是继续播放,就好像它是一首不受 segues 打断的曲目。
最终我需要在显示 GameOverViewController
时暂停或停止音乐,因为音乐与随后播放的任何视频广告发生冲突。有人知道这样做的最佳方法吗?
考虑一下,如果 GameIntroViewController
和 GameViewController
上有不同的音乐,然后 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" 并将其从一个视图控制器传递到下一个视图控制器,就像传递模型对象一样。也许更好的是,您可以制作曲目列表来播放应用程序数据模型的一部分,这样视图控制器就可以通过与模型交互来影响即将播放的音乐曲目——它们甚至不需要知道音乐控制器。
我目前正在开发一款游戏,该游戏包含三个视图控制器:GameIntroViewController
GameViewController
GameOverViewController
.
每个视图控制器都通过推送链接 segue
。使用以下方法...
GameIntroViewController
按钮 -> GameViewController
编程 -> GameOverViewController
按钮 -> GameViewController
等等....
我目前已经将应用程序设置为开始在我的 GameIntroViewController
中播放背景音乐,这很好用,但令人惊讶的是音乐会在每次转场时重新开始,虽然这不是问题我'我希望音乐不要重新开始,而是继续播放,就好像它是一首不受 segues 打断的曲目。
最终我需要在显示 GameOverViewController
时暂停或停止音乐,因为音乐与随后播放的任何视频广告发生冲突。有人知道这样做的最佳方法吗?
考虑一下,如果 GameIntroViewController
和 GameViewController
上有不同的音乐,然后 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" 并将其从一个视图控制器传递到下一个视图控制器,就像传递模型对象一样。也许更好的是,您可以制作曲目列表来播放应用程序数据模型的一部分,这样视图控制器就可以通过与模型交互来影响即将播放的音乐曲目——它们甚至不需要知道音乐控制器。