我怎么能抓住SKScene暂停或audioEngine停止的那一刻?

时间:2016-08-23 16:38:05

标签: swift swift2 skscene avaudioengine

我怎样才能抓住SKScene暂停或者audioEngine停止的那一刻?

我有两个SKScenes:GameScene和EndScene,我在游戏中使用GameScene的audioEngine属性播放声音(此属性包含AVAudioEngine对象)。当游戏结束时,场景从GameScene变为EndScene:

        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停止的那一刻?对于这种情况,是否有一些合适的通知或事件处理程序,可能吗?

2 个答案:

答案 0 :(得分: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()]))

}

答案 1 :(得分:0)

每次调用一帧(每秒60次)时,使用update功能检查此项。在其中,放置一个条件语句(if,while等),检查您想要的条件。例如,使用此选项检查场景是否暂停:

override func update(currentTime: CFTimeInterval) {

if isPaused == true {

// Code to run when scene is paused

       }

}

请注意,这是在Swift 3中,在较低版本中isPaused只是paused

另一种选择可能是使用whiledo-while等循环来持续检查条件