用spritekit和swift在游戏中实现短音

时间:2016-06-23 14:22:33

标签: ios swift audio sprite-kit

我正在使用SpriteKit框架和Swift代码

开发iOS游戏

我即将在游戏中包含声音FX,所以这样,我需要使用很多短音,同时播放其中一些,并与其他精灵事件同步。我不需要对音量,循环或停止进行精确控制。我正在尝试以下相关成功的选项:

  • 我尝试使用SKActions通过playSoundFileNamed播放声音文件,预加载变量:它非常简单快速,但它创建了一个连续且不断增长的内存分配OpenAl(XCode utils tracking)无法解除分配,使内存增加到应用程序崩溃(每个声音大约100KB)

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

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

  • 我尝试使用OpenAL,但我找不到任何有用的指南,可以在编程组合SpriteKit& Swift,仅在Objective-C

  • 中找到

哪种方法最适合我的目标?

谢谢

2 个答案:

答案 0 :(得分:0)

通常,我喜欢使用来自SKUtils的名为 SKTAudio 的漂亮库(基于AVFoundation框架的简单sharedInstance)播放我的声音:

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")

答案 1 :(得分:0)

首先解决方案 - 使用SKAudioNode。如果您使用的是SKS文件,则可以将声音直接放在场景中。该类没有内存问题。在播放声音之前,您必须检查场景的audioEngine是否正在运行 - 例如,您正在转换到另一个场景。

第二 - 你可以尝试使用ObjectAL(不是OpenAL)http://kstenerud.github.io/ObjectAL-for-iPhone/