2016-07-15 64 views
0

我正在創建一個遊戲,用戶使用jetpack控制角色。當噴氣揹包與鑽石相交時,我會將鑽石加入其中,然後發出聲音。然而,聲音會讓遊戲暫停十分之一秒左右並擾亂遊戲流程。這是我使用的代碼: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() 
     } 

    } 

而且我使用雪碧套件,如果該事項。任何幫助是極大的讚賞!

+0

我會嘗試使用'SKAudioNode'或'SKAction.playSoundWithFileNamed'第一,因爲他們在建造時,是與SpriteKit一起使用。此外,由於您正在嘗試捕捉,因此您不需要警惕,我會將其刪除。如果從AVAudioPlayer返回一個零,它會觸發捕獲 – Knight0fDragon

+0

我看到的問題是,你可能會多次發射播放,添加一個檢查只播放一次,AVAudioPlayer有一個「玩」布爾值,你可以檢查 – Knight0fDragon

+0

只是因爲你從父母中刪除鑽石,並不意味着鑽石已經死亡,即使鑽石不在現場,你的相交節點仍然會通過 – 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問題沒有滯後的答案,其次你必須區分背景音樂和效果之間的音頻。顯然,擴展不能做你的遊戲的音頻管理器。保持玩家參考和不止一名球員是好事。一個動作不僅可以從所涉及的精靈中啓動。這種方法可以用於很少的效果不能合理地不需要暫停,否則你可以改進它以啓用暫停,如果你想。 –

+0

有滯後,你的音頻沒有準備好,直到發生跑塊爲止,它可能不會延遲遊戲,但音頻本身會被延遲。我的觀點是你正在創建一個SKAudioNode所做的擴展,但效果很差。 SKAudioNodes可以表現得幾乎與動作一樣,但是不是添加一個動作到一個節點,而是添加一個孩子。這就是它的缺點,你可以拿這個免費的水桶來獲得你的水,或者您可以使用自己的資源來構建自己的存儲桶並冒險發現漏洞,因爲您可能錯過了一個步驟 – Knight0fDragon