我怎样才能抓住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停止的那一刻?对于这种情况,是否有一些合适的通知或事件处理程序,可能吗?
答案 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
另一种选择可能是使用while
和do-while
等循环来持续检查条件