2016-08-23 66 views
1

我該如何捕捉瞬間SKScene變爲暫停或audioEngine停止了?我有兩個SKScenes:GameScene和EndScene,我在遊戲中使用GameScene的audioEngine屬性(此屬性包含AVAudioEngine對象)播放聲音。當比賽結束時,從GameScene場景變化EndScene:我該如何捕捉瞬間SKScene變成暫停或audioEngine停止了?

 self.view?.presentScene(EndScene()) 

在此之後,當用戶觸摸«重啓»,比賽重新開始,場景變化從EndScene回GameScene:

 self.view?.presentScene(GameScene(), transition: SKTransition.crossFadeWithDuration(1.0)) 

當場景從EndScene變爲GameScene時,GameScene暫停了一秒(因爲參數值爲SKTransition.crossFadeWithDuration(1.0))。由於GameScene暫停,audioEngine也停止了。此後,GameScene會自動啓動,但audioEngine不會啓動並停止。然後,遊戲在第一次嘗試播放聲音時崩潰,這很明顯:因爲audioEngine已停止。 爲了避免這種情況,我需要在audioEngine停止後啓動它,但是有一個問題需要解決:GameScene的didMoveToView()中試圖捕獲它,但GameScene沒有暫停,它暫停了之後,didMoveToView()已經完成。 這是我的問題: 我該如何捕捉瞬間SKScene變成暫停或audioEngine停止了?有沒有適合這種情況的通知或事件處理程序,也許?

回答

0

使用update函數來檢查每次調用幀(每秒60次)。在它裏面,放一個條件語句(如果,等等)來檢查你想要的條件。例如,用此來檢查如果場景暫停:

override func update(currentTime: CFTimeInterval) { 

if isPaused == true { 

// Code to run when scene is paused 

     } 

} 

請注意,這是斯威夫特3和更低的版本isPaused只是paused

另一個選擇可能是使用循環像whiledo-while連續的條件檢查

+0

在問我的問題之前,我想過使用update()事件來捕捉這個,但在我看來這是相當粗糙的方式。使用do-while的方式(在didMoveToView結尾,正如我的建議你的意思)看起來更有效率,謝謝你的建議。但是,最後,我決定在聲音播放之前每次檢查audioEngine狀態,在功能播放聲音。我認爲這種方法合理高效。我已經發布它作爲下面我自己的問題的答案。 –

+0

好的。它取決於你,因爲有很多方法可以做到這一點。 – Nik

1

最後,我已經降至試圖找到一些合適的通知或事件,並決定每次的Audioengine檢查狀態聲音播放之前,在功能上播放聲音。我認爲這種方式是合理的效率:

func playSound(soundType: Sounds) { 

    if !audioEngine.running { 
     do { 
      try audioEngine.start() 
     } catch { 
     } 
    } 

    var soundNode = SKAudioNode() 
    var waitingDuration = Double() 

    switch soundType { 
    case .enemyDestroyed: 
     soundNode = SKAudioNode(fileNamed: "Blip001.wav") 
     waitingDuration = 3 
    case .playerDestroyed: 
     soundNode = SKAudioNode(fileNamed: "Noise002.wav") 
     waitingDuration = 5 
    } 

    soundNode.autoplayLooped = false 

    self.addChild(soundNode) 
    soundNode.runAction(SKAction.changeVolumeTo(0.5, duration: 0)) 
    soundNode.runAction(SKAction.changeReverbTo(0.5, duration: 0)) 
    soundNode.runAction(SKAction.sequence([SKAction.play(), SKAction.waitForDuration(waitingDuration), SKAction.removeFromParent()])) 

}