gpt4 book ai didi

ios - 游戏中的 SWIFT AVAudioPlayer 多个场景,停止不工作

转载 作者:行者123 更新时间:2023-11-28 09:09:49 24 4
gpt4 key购买 nike

与这个问题非常相似:

Using AVAudioPlayer across multiple scenes Swift and be able to adjust volume

我想跨多个场景播放背景音乐,但我需要在进入某些场景时停止。

例如,我所有的菜单场景都应该播放音乐,但是当我进入 GamePlayScene 时,当前音乐应该停止并播放新音乐。

我已经在上面的帖子中实现了修复(根据我的需要对其进行了一些更改)但是它不起作用...现在发生的是 BG 音乐继续播放,然后我的游戏音乐也播放

        if let vc = UIApplication.sharedApplication().keyWindow?.rootViewController as? GameViewController{
vc.menuMusicPlayer.stop()
println("stop the bg audio")
}

这个 println 甚至没有被执行 - 暗示 if 不是真的?

我的 GameViewController 是我所有场景的父...

不确定我哪里出错了。有什么建议吗?

GameViewController 代码 - 内部

override func viewDidLoad {
var menuMusicPlayer:AVAudioPlayer = AVAudioPlayer()

var bgMusicURL:NSURL = NSBundle.mainBundle().URLForResource("menuSounds", withExtension: "m4a")!
menuMusicPlayer = AVAudioPlayer(contentsOfURL: bgMusicURL, error: nil)
menuMusicPlayer.volume = 0.25
menuMusicPlayer.numberOfLoops = -1
menuMusicPlayer.prepareToPlay()
if music_on == true && menuMusicPlayer.playing == false { menuMusicPlayer.play() }

而且我还有一个函数可以停止 GameViewController 中的音乐我试过触发 func 或直接告诉 menuMusicPlayer 停止(),但都没有用。

func BGMusicStop() {
if menuMusicPlayer.playing == true {
menuMusicPlayer.stop()
println("bg music should stop")
}
}

最佳答案

您在 viewDidLoad 中的代码只是将音频播放器分配给局部变量。在 viewDidLoad 完成后,您将永远无法获得对它的引用。避免重新声明 menuMusicPlayer 或至少在最后分配 self.menuMusicPlayer 。这里需要指定self,因为使用同名的类变量和局部变量会造成歧义。

至于为什么你不能使用 if let 从任何你想要的地方获得 rootVC...好吧我怀疑你的 rootVC 是其他类(很难说出你所说的“是我所有场景的父级”是什么意思),但我建议不要使用您为音频播放器的所有权所采用的方法。通过 sharedApplication->rootVC 和所有看起来很老套的东西。也许您应该实现一个单例或服务定位器来包含要在您的应用程序中使用的实例。

关于ios - 游戏中的 SWIFT AVAudioPlayer 多个场景,停止不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29590396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com