簡體   English   中英

用spritekit和swift在游戲中實現短聲音

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM