ios - 使用 spritekit 和 swift 在游戏中实现短声音

标签 ios swift audio sprite-kit

我正在使用 SpriteKit 框架和 Swift 代码开发 iOS 游戏

我即将在游戏中包含声音 FX,因此,这样,我需要使用大量短声音,同时播放其中一些声音,并与其他 Sprite 事件同步。我不需要精确控制音量、循环或停止。我正在尝试以下选项并取得了相对成功:

  • 我尝试使用 SKActions 通过 playSoundFileNamed 来播放声音文件,预加载变量:这确实简单快捷,但它创建了一个OpenAl(XCode utils 跟踪)中连续且不断增长的内存分配无法释放,导致内存增加直至应用程序崩溃(每个声音大约 100KB)

  • 我尝试使用 AudioToolbox 框架通过 AudioServicesCreateSystemSoundID 播放声音文件,但它有一次播放多个文件的限制

  • 我尝试使用使用 AVFoundation 的音频播放器。它不会产生任何内存泄漏,但当我执行播放声音的操作时,它会使我的应用程序延迟

  • 我尝试使用 OpenAL,但找不到任何有用的指南来轻松实现编程组合 SpriteKit 和 Swift,只能在 Objective-C 中找到

哪种方法是实现我的目标的最佳方法?

谢谢

最佳答案

通常,我更喜欢使用一个不错的库(一个基于 AVFoundation 框架的简单共享实例)来播放声音,该库名为 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")

关于ios - 使用 spritekit 和 swift 在游戏中实现短声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37994401/

相关文章:

ios - Swift ios 检查哪个 View Controller 存在

ios - 我怎么知道 Tab Bar Controller 索引是否以编程方式快速更改?

ios - Xcode 7 beta 5 中 iOS 9.0 之前的 UIStackView

Swift 枚举, `OR` 均衡

javascript - 由于 “Invisible [Flash] content is always blocked.”,jplayer的Flash后备广告无法在Chrome中使用

ios - 在 iOS 中查看来自 managedObject 的值显示错误的值

ios - COLLADA 纹理未出现在场景套件中

ios - Swift 5 UIButton 标题没有改变

audio - 带有 2 个音轨的 .mp4 视频文件示例可以下载吗?

javascript - 在 HTML5 中构建音频混合器