Как добавить песню, сыгранную на 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
Надеюсь это поможет