我似乎找不到关于SKAudioNode的太多信息。如何只播放一次声音?我不想重复播放声音。
我的目标是在SpriteKit中每次生成子弹时播放短激光声音。
我似乎找不到关于SKAudioNode的太多信息。如何只播放一次声音?我不想重复播放声音。
我的目标是在SpriteKit中每次生成子弹时播放短激光声音。
很遗憾,@KnightOfDragon所说的不正确(但我没有足够的声望评论)。
SKAudioNode
在iOS 9中被引入,旨在替代SKAction.playSoundFileNamed(...)
因为它更加强大(您可以将其作为SpriteKit SKNode
的子节点添加,如果将属性positional
设置为true,则自动添加3D音频混合)。
若要使用SKAudioNode
播放一次声音,请使用以下代码:
if #available(iOS 9, *) {
let pling = SKAudioNode(fileNamed: "pling.wav")
// this is important (or else the scene starts to play the sound in
// an infinite loop right after adding the node to the scene).
pling.autoplayLooped = false
someNode.addChild(pling)
someNode.runAction(SKAction.sequence([
SKAction.waitForDuration(0.5),
SKAction.runBlock {
// this will start playing the pling once.
pling.runAction(SKAction.play())
}
])
}
else {
// do it the old way
}
看一下这里,如何在音频节点上使用Actions: SKAction->Audio-Stuff。文档中说:
仅对短暂的插曲使用SKAction playSoundFileNamed:waitForCompletion:。对于长时间运行的背景音乐,请使用AVAudioPlayer。
这并不意味着不能使用SKAudioNode
进行一次性音频。使用playSoundFileNamed
无法更改音量或暂停/停止播放等。
SKAction.playSoundFileNamed(...)
。而 SKAudioNode 更适合在游戏中播放音乐。//we have ship as an SKSpriteNode
//lets fire laser
ship.runAction(SKAction.playSoundFileNamed("pewpewpew.caf",waitForCompletion:false));
let pewpew = SKAction.play....
,然后只需调用 ship.runAction(pewpew);
。 - Knight0fDragon
playSoundFileNamed
没有位置音频或任何更复杂的选项,它是为了轻松地进行一次性音频而设计的,没有任何控制。另一方面,AVFoundation
更加复杂,不太容易集成到SpriteKit中。SKAudioNode
是一种将AVFoundation
集成到SpriteKit中的简单方法(因为它在幕后使用AVFoundation
)。但更重要的是,我认为SKAudioNode
主要不是用于音乐,因为您可以将其用于定位音频,这不太可能用于音乐。 - JuangamnikSKAction.playSoundFileNamed
,但不幸的是,它也存在一些错误。 - WhirlwindSKAudioNode
提供了这种控制,我可能会使用SKAudioNode
,只要我能保持良好的性能... - Whirlwind