在不同的 UIKit 和 SpriteKit 场景中连续播放音频

Posted

技术标签:

【中文标题】在不同的 UIKit 和 SpriteKit 场景中连续播放音频【英文标题】:continuous audio playing across different UIKit & SpriteKit scenes 【发布时间】:2017-08-01 12:36:42 【问题描述】:

我有一个包含多个视图控制器的应用。其中一些 ViewController 的视图是 UIViews,其他的是 SKViews。我想从用户进入游戏的那一刻开始播放音频,并继续播放相同的曲目而不会中断,即使从 VC 切换到另一个。这可能吗?

【问题讨论】:

您可以通过 AppDelegate 运行音频,但我不会这样做。使用 SpriteKit 开发游戏时,您应该坚持使用一个视图控制器。 @El Tomato,这完全取决于应用程序,我设计了一些主要基于 UIKit 的应用程序,但有一个小窗口供小游戏存在。现在我使用这些公司应用程序,所以我无法将其链接到您的实际操作中。 【参考方案1】:

您可以使用 AVPlayer 实例进行音频播放。要循环播放音轨以使其连续播放,您必须检查“AVPlayerItemDidPlayToEndTime”通知并重新启动播放器。

如果您想跨多个视图控制器播放曲目,我建议创建一个包含 AVPlayer 实例并控制播放的类。然后只需创建该类的静态实例,即可在整个应用程序中访问它。

import AVKit

class AudioManager 

    static var sharedInstance = AudioManager()

    private var player: AVPlayer?

    func play() 
        // TODO: Initialize AVPlayer with desired audio track & start playing
        // player = AVPlayer(...)
        player?.play()

        // Register for the did play to end time notification to loop audio
        if let item = player?.currentItem 
            NotificationCenter.default.addObserver(self, selector: #selector(onPlaybackFinished), name: .AVPlayerItemDidPlayToEndTime, object: item)
        
    

    @objc private func onPlaybackFinished() 
        player?.seek(to: kCMTimeZero)
        player?.play()
    



// to start playback from anywhere in your app
AudioManager.sharedInstance.play()

AVPlayer 文档:https://developer.apple.com/documentation/avfoundation/avplayer

【讨论】:

以上是关于在不同的 UIKit 和 SpriteKit 场景中连续播放音频的主要内容,如果未能解决你的问题,请参考以下文章

iOS 混合 Spritekit 和 UIKit

在 SpriteKit 项目中包含一个 UIKit 小游戏

SpriteKit 集成到 UIKit [重复]

什么大致类似于 iOS-UIKit 中的 cocos2D 场景?

如何在不同的 SpriteKit 场景中显示 iAd 横幅

Swift:Spritekit 中的多个场景,从第二个和第一个场景的不同 Sprite 节点类型调用 touchesBegan