为什么我的声音使我的游戏在Swift Spritekit中滞后?

时间:2015-04-12 03:29:01

标签: swift audio avfoundation

当我的英雄节点收集硬币并且我的游戏中存在这种小打嗝时,我有这种声音效果。当收集硬币时涉及声音时,它不像其他游戏那样平滑。我究竟做错了什么?继承我的声音代码:

  class GameScene: SKScene, SKPhysicsContactDelegate {

   var coinSound =  NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("coin", ofType: "wav")!)
   var coinAudioPlayer = AVAudioPlayer()

   override func didMoveToView(view: SKView) {

   coinAudioPlayer = AVAudioPlayer(contentsOfURL: coinSound, error: nil)
   coinAudioPlayer.pause()
   }

   if firstBody.categoryBitMask == HeroCategory && secondBody.categoryBitMask == CoinCategory {

   coinAudioPlayer.prepareToPlay()
   coinAudioPlayer.play()
   coinAudioPlayer.currentTime = NSTimeInterval(1.0)
    }

2 个答案:

答案 0 :(得分:5)

使用SKAction.playSoundFileNamed。当您提前创建SKAction实例时,它会执行所有必要的准备工作以执行操作(在这种情况下,播放声音),而不会在游戏过程中出现延迟。要运行动作(播放声音),请在节点上调用runAction - 这可以是任何节点,甚至是场景本身。

由于您使用哪个节点用于声音目的无关紧要,请使用最方便的节点。例如,如果您只是播放声音,则可以在场景中调用runAction。但是,如果你的声音是一个动作组或序列的一部分,比如动画精灵,你可以将声音动作作为该序列的一部分,然后在你动画的精灵上播放它。

有关操作的详情,请参阅SpriteKit Programming Guide


不相关的Swift提示:对于不会更改的引用,请使用let代替var。它可以帮助您避免以后引入错误,它也可能有助于编译器优化您的代码。

答案 1 :(得分:0)

你不应该在碰撞时调用prepareToPlay,prepareToPlay设置声音缓冲区,在didMoveToView函数中执行此操作