2015-04-12 4 views
3

У меня есть этот звуковой эффект, когда мой узел героя собирает монету, и в моей игре есть небольшая икота. Это не так гладко, как в других играх, когда есть звук при сборке монеты. Что я делаю не так? Heres мой код для звука:Почему мой звук делает мой игровой лаг в Swift Spritekit?

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) 
    } 
+0

Любая причина, по которой вы не используете ['SKAction.playSoundFileNamed'] (https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKAction_Ref/index.html#//apple_ref/occ/CLM/SKAction/playSoundFileNamed: waitForCompletion :)? – rickster

+0

Я не знал, что вы можете это сделать. Есть ли еще код или это именно так. Благодарю. – newtocoding

ответ

4

Использование SKAction.playSoundFileNamed. Когда вы создаете экземпляр SKAction раньше времени, он выполняет всю необходимую подготовку для выполнения действия (в данном случае, воспроизведения звука) без лаг во время игрового процесса. Чтобы запустить действие (воспроизвести звук), вызовите runAction на узле - это может быть любой узел, даже сама сцена.

Так как это не имеет значения, какой узел вы используете для использования в качестве звука, используйте то, что наиболее удобно. Например, если вы просто воспроизводите звук, вы можете называть runAction на сцене. Но если ваш звук является частью группы действий или последовательности, которые, скажем, оживляют спрайт, вы можете сделать звук частью этой последовательности и воспроизвести ее на спрайте, который вы анимации.

См. SpriteKit Programming Guide для получения дополнительной информации о действиях.


Unrelated Swift совет: использовать let вместо var для ссылок, которые не будут меняться. Это может помочь вам избежать появления ошибок позже, и, вероятно, это поможет компилятору оптимизировать ваш код.

+0

Я добавил это туда, где происходит контакт между героем и монетой, и я получаю сообщение об ошибке: let playSound = SKAction.playSoundFileNamed («монета», waitForCompletion: true) – newtocoding

+0

Это ошибка, которую я получаю: *** Завершение действия приложения чтобы исключить исключение «NSInvalidArgumentException», причина: «Ресурсная монета не найдена в основном пакете» – newtocoding

+0

Это работает. Я забыл поместить .wav. Спасибо, что работает отлично! – newtocoding

0

вы не должны называть prepareToPlay о столкновении, prepareToPlay настраивает звуковой буфер, сделать это в вашей didMoveToView функции

+0

все еще есть отставание в моей игре, когда я помещаю prepareToPlay в файл didMoveToView. – newtocoding

Смежные вопросы