我有一个SKSpriteNode的子类叫做' backgroundMusic'由SKSpriteNode和AVAudioPlayer文件组成。目标是完全删除背景音乐'在我实例化之后。我试着这样做:
backgroundMusic.removeFromParent()
但它只删除了SKSpriteNode而不是AVAudioPlayer。
主要问题是在这个子类中,我在其他函数中调用了一堆函数,当我尝试通过以下方式清空子类时:
backgroundMusic = nil
调用所有函数的过程仍在发生,并在重新实例化时导致问题。我认为可行的是,如果我删除了背景音乐'完全,这将停止函数调用进程,然后在我需要时重新实例化它,它应该正常工作没有问题。我怎么能这样做?
编辑我试过了:
self.delete(backgroundMusic)
它崩溃了应用程序。我应该用这个吗?如果是这样的话?
答案 0 :(得分:0)
这是因为你没有配置Audio Session
一些播放代码:
import AVFoundation
var audioPlayer = AVAudioPlayer()
func playAudio() {
// Set the sound file name & extension
let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav")!)
// Preperation
try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: AVAudioSessionCategoryOptions.MixWithOthers)
try! AVAudioSession.sharedInstance().setActive(true)
// Play the sound
do {
try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch {
print("there is \(error)")
}
}
文档详情:
AVAudioSessionCategoryOptionMixWithOthers
将此会话中的音频与来自其他活动会话的音频混合。
仅在会话类别为时有效 AVAudioSessionCategoryPlayAndRecord或AVAudioSessionCategoryPlayback。 (如果会话类别是AVAudioSessionCategoryAmbient,则隐含。)
如果您在使用此选项时激活会话,则应用的音频 不会中断来自其他应用程序(例如音乐应用程序)的音频。如果 不使用此选项(或隐式混合的类别), 激活会话将中断其他不可混合的会话。
要停止,你可以这样做:
do {
try AVAudioSession.sharedInstance().setActive(false)
} catch let error as NSError {
print(error.localizedDescription)
}