2016-07-15 2 views
0

Я создаю игру, в которой пользователь управляет персонажем с помощью реактивного пакета. Когда реактивный пакет пересекает алмаз, я добавляю алмаз к их сумме, а затем воспроизвожу звук. Тем не менее, звук делает паузу игры на десятую часть секунды или около того и нарушает поток. Это код, я использую:Игра, когда проигрывается AVAudioPlayer

var diamondSound = NSBundle.mainBundle().URLForResource("diamondCollect", withExtension: "wav")! 
var diamondPlayer = AVAudioPlayer?() 

    class GameScene: SKScene{ 

     override func didMoveToView(view: SKView) { 

      do { 
       diamondPlayer = try AVAudioPlayer(contentsOfURL: diamondSound) 
       guard let player = diamondPlayer else { return } 

       player.prepareToPlay() 
      } catch let error as NSError { 
       print(error.description) 
      } 
     } 

А потом:

override func update(currentTime: CFTimeInterval) { 

     if character.intersectsNode(diamond){ 
      diamondPlayer?.play() 
      addDiamond() 
      diamond.removeFromParent() 
     } 

    } 

Также я использую Sprite Kit, если это имеет значение. Любая помощь очень ценится!

+0

Я бы попробовать и использовать '' SKAudioNode' или SKAction.playSoundWithFileNamed' первым, так как они построены, чтобы быть используется с SpriteKit. Кроме того, вам не нужен защитник, так как вы делаете попытку поймать, я бы удалил его. если из AVAudioPlayer возвращается nil, он загорится уловом – Knight0fDragon

+0

Проблема, которую я вижу, может быть, вы несколько раз стреляете в игру, добавьте чек, чтобы играть только один раз, у AVAudioPlayer есть 'играющий логин, вы можете проверить – Knight0fDragon

+0

Просто потому, что вы удаляете алмаз от родителя, не означает, что алмаз мертв, ваш intersectsNode будет проходить, даже если алмаз не находится на сцене. – Knight0fDragon

ответ

0

Как правило, я предпочитаю использовать SKAction.playSoundWithFile в своих играх, но у этого есть ограничение, нет регулировки громкости. Так, йота это расширение, которое вы можете решить этот недостаток:

public extension SKAction { 
    public class func playSoundFileNamed(fileName: String, atVolume: Float, waitForCompletion: Bool) -> SKAction { 

    let nameOnly = (fileName as NSString).stringByDeletingPathExtension 
    let fileExt = (fileName as NSString).pathExtension 

    let soundPath = NSBundle.mainBundle().URLForResource(nameOnly, withExtension: fileExt) 


    var player: AVAudioPlayer! = AVAudioPlayer() 
    do { player = try AVAudioPlayer(contentsOfURL: soundPath!, fileTypeHint: nil) } 
    catch let error as NSError { print(error.description) } 

    player.volume = atVolume 

    let playAction: SKAction = SKAction.runBlock {() -> Void in 
     player.prepareToPlay() 
     player.play() 
    } 

    if(waitForCompletion){ 
     let waitAction = SKAction.waitForDuration(player.duration) 
     let groupAction: SKAction = SKAction.group([playAction, waitAction]) 
     return groupAction 
    } 

    return playAction 
    } 
} 

Использование:

self.runAction(SKAction.playSoundFileNamed("diamondCollect.wav", atVolume:0.5, waitForCompletion: true)) 
+0

Зачем вам решать эту проблему, используйте SKAudioNode, как я уже упоминал в комментариях. Есть много проблем с вашим подходом (что то же самое, что и OP, вот почему я сказал ему переключиться), один из которых, если вы приостановите спрайт, ваш звук по-прежнему будет воспроизводиться – Knight0fDragon

+0

Это не проблема, это один из многих подходов, которые вы можете использовать (например, библиотека SKTAudio). Прежде всего, нет ответа на вопрос OP, во-вторых, вы должны отличить свой звук между фоновой музыкой, эффектами. Obviusly, расширение не может выполнять Audio Manager вашей игры. Это бетт, чтобы поддерживать ссылки игроков и более одного игрока. Действие может быть запущено не только из спрайта. Этот метод может быть использован для небольших эффектов, которые не могут быть разумно приостановлены, в противном случае вы можете улучшить его, чтобы включить паузу, если хотите. –

+0

Существует лаг, ваш звук не готов до тех пор, пока не произойдет запуск блока, он может не отставать от игры, но сам звук будет отложен. Я хочу сказать, что вы создаете расширение, которое делает то, что делает SKAudioNode, но плохо. SKAudioNodes могут вести себя почти так же, как действия, но вместо добавления действия к узлу вы добавляете ребенка. Вот к чему это сводится. Вы можете взять это бесплатное ведро, чтобы получить свою воду и, как известно, удерживать ее, или вы можете использовать свои ресурсы для создания собственного ведра и рискнуть его утечки из-за того, что вы, возможно, пропустили шаг – Knight0fDragon

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