[英]implementing short sounds in game with spritekit and swift
我正在使用SpriteKit
框架和Swift代碼為iOS開發游戲。
我將在游戲中加入聲音FX,因此,我需要使用很多短聲音,同時播放其中的一些聲音,並與其他精靈事件同步。 我不需要精確控制音量,循環或停止。 我正在嘗試以下相對成功的選擇:
我嘗試使用SKActions
通過playSoundFileNamed
來播放聲音文件,並預加載了變量:這確實非常簡單且快速,但是它在OpenAl(XCode utils跟蹤)中創建了連續不斷增長的內存分配,無法取消分配,從而導致內存增加導致應用崩潰(每個聲音大約100KB)
我試圖使用AudioToolbox
框架通過AudioServicesCreateSystemSoundID
播放聲音文件,但是它一次播放多個文件具有局限性
我嘗試使用使用AVFoundation
音頻播放器。 它不會產生任何內存泄漏,但是會在我執行聲音播放操作時使我的應用延遲
我嘗試使用OpenAL,但找不到任何有用的指南來輕松地在編程組合SpriteKit和Swift中實現,僅在Objective-C中找到
達到我目標的最佳方法是什么?
謝謝
通常情況下,我preefer用一個漂亮的庫(基於AVFoundation框架簡單sharedInstance)從名為SKTAudio發揮出自己的聲音SKUtils :
func playSoundEffect(filename: String) {
let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
if (url == nil) {
print("Could not find file: \(filename)")
return
}
var error: NSError? = nil
do {
soundEffectPlayer = try AVAudioPlayer(contentsOfURL: url!)
} catch let error1 as NSError {
error = error1
soundEffectPlayer = nil
}
if let player = soundEffectPlayer {
player.numberOfLoops = 0
player.prepareToPlay()
player.play()
} else {
print("Could not create audio player: \(error!)")
}
}
}
它非常簡單易用,您可以將其聲明為全局變量:
var audioManager : SKTAudio = SKTAudio.sharedInstance()
然后,您可以播放簡單的效果,如下所示:
self.audioManager.playSoundEffect("menu-click.mp3")
第一個解決方案-使用SKAudioNode。 如果您使用的是SKS文件,則可以將聲音直接放在場景中。 該類沒有內存問題。 在播放聲音之前,您必須檢查場景的audioEngine是否正在運行-例如,因為您正在過渡到另一個場景。
第二-您可以嘗試使用ObjectAL(而非OpenAL) http://kstenerud.github.io/ObjectAL-for-iPhone/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.