Как добавить песню, сыгранную на 2 моих сценах в моей быстрой игре

Моя финальная игра закончена, и SKTransition возвращается в главное меню. Я могу сыграть песню для финальной игры поверх сцены, но я бы хотел, чтобы песня продолжалась в моем главном меню.

Вот копия кода, который у меня есть на данный момент.

import Foundation
import SpriteKit
import AVFoundation


class SceneThree: SKScene {

   var game = SKSpriteNode()

var new: AVAudioPlayer?

override func didMove(to view: SKView) {

    self.backgroundColor = SKColor.black

    playSound()

}

func playSound() {
    let url = Bundle.main.url(forResource: "new", withExtension: "caf")!

    do {
        new = try AVAudioPlayer(contentsOf: url)
        guard let new = new else { return }

        new.prepareToPlay()
        new.play()
    } catch let error {
        print(error.localizedDescription)
    }
}



override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    let gameScene = GameScene(fileNamed: "GameScene")
    gameScene?.scaleMode = .aspectFill
    self.view?.presentScene(gameScene!, transition: SKTransition.fade(withDuration: 4.5))



}

1 ответ

Когда вы меняете сцену, старая будет уничтожена, включая ваше свойство AVPlayer.

Вы можете создать вспомогательный класс для своей музыки, чтобы избежать этого.

class MusicManager {

    static let shared = MusicManager()

    var audioPlayer = AVAudioPlayer()


    private init() { } // private singleton init


    func setup() {
         do {
            audioPlayer =  try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "music", ofType: "mp3")!))
             audioPlayer.prepareToPlay()

        } catch {
           print (error)
        }
    }


    func play() {
        audioPlayer.play()
    }

    func stop() {
        audioPlayer.stop()
        audioPlayer.currentTime = 0 // I usually reset the song when I stop it. To pause it create another method and call the pause() method on the audioPlayer.
        audioPlayer.prepareToPlay()
    }
}

Когда ваш проект запускается, просто вызовите метод установки

MusicManager.shared.setup()

Чем из любого места в вашем проекте вы можете сказать

MusicManager.shared.play()

играть музыку.

Чтобы остановить это, просто вызовите метод stop

MusicManager.shared.stop()

Для более многофункционального примера с несколькими треками, посмотрите мой помощник на GitHub

https://github.com/crashoverride777/SwiftyMusic

Надеюсь это поможет

Другие вопросы по тегам