gpt4 book ai didi

swift - 我怎样才能捕获 SKScene 暂停或 audioEngine 停止的时刻?

转载 作者:行者123 更新时间:2023-11-28 06:35:50 25 4
gpt4 key购买 nike

如何捕捉 SKScene 暂停或 audioEngine 停止的时刻?

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

        self.view?.presentScene(EndScene())

在此之后,当用户触摸 «Restart» 时,游戏再次开始,场景从 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 停止的时刻?是否有适合这种情况的通知或事件处理程序?

最佳答案

最后,我放弃了寻找一些合适的通知或事件的尝试,并决定每次在播放声音之前检查 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()]))

}

关于swift - 我怎样才能捕获 SKScene 暂停或 audioEngine 停止的时刻?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39106553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com