В ответ на совет Майка Пандольфини не использовать playSoundFileNamed, я преобразовал свой код, чтобы использовать только SKAudioNodes.(и отправил отчет об ошибке в яблоко).Затем я обнаружил, что некоторые из этих SKAudioNodes также не воспроизводятся после прерывания приложения ... и я наткнулся на исправление.Вы должны указать каждому SKAudioNode остановить (), когда приложение подает в отставку или возвращается из фона - даже если они не воспроизводятся.
(сейчас я не использую какой-либо код в моем первомсообщение, которое останавливает звуковой движок и деактивирует сеанс)
Затем возникла проблема, как быстро воспроизвести тот же звук, где он, возможно, воспроизводится сам по себе.Это было то, что было так хорошо в playSoundFileNamed.
1) Исправление SKAudioNode:
Предварительная загрузка ваших SKAudioNodes, т.е.
let sound = SKAudioNode(fileNamed: "super-20")
В didMoveToView добавьте их
sound.autoplayLooped = false
addChild(sound)
Добавление уведомления willResignActive
notificationCenter.addObserver(self, selector:#selector(willResignActive), name:UIApplication.willResignActiveNotification, object: nil)
Затем создайте функцию селектора, которая останавливает воспроизведение всех аудио-узлов:
@objc func willResignActive() {
for node in self.children {
if NSStringFromClass(type(of: node)) == “SKAudioNode" {
node.run(SKAction.stop())
}
}
}
Все SKAudioNodes теперь надежно воспроизводятся после прерывания приложения.
2) Чтобы воспроизвести способность playSoundFileNamed воспроизводить короткие быстрые повторяющиеся звуки или более длинные звуки, которые могут понадобиться для воспроизведения более одного раза и, следовательно, могут перекрываться, создайте / предварительно загрузите более 1 свойства для каждого звука и используйте их следующим образом:
let sound1 = SKAudioNode(fileNamed: "super-20")
let sound2 = SKAudioNode(fileNamed: "super-20")
let sound3 = SKAudioNode(fileNamed: "super-20")
let sound4 = SKAudioNode(fileNamed: "super-20")
var soundArray: [SKAudioNode] = []
var soundCounter: Int = 0
в didMoveToView
soundArray = [sound1, sound2, sound3, sound4]
for sound in soundArray {
sound.autoplayLooped = false
addChild(sound)
}
Создание функции воспроизведения
func playFastSound(from array:[SKAudioNode], with counter:inout Int) {
counter += 1
if counter > array.count-1 {
counter = 0
}
array[counter].run(SKAction.play())
}
Чтобы воспроизвести звук, передайте массив этого конкретного звука и его счетчик в функцию воспроизведения.
playFastSound(from: soundArray, with: &soundCounter)