Swift SKAudioNode只播放一次声音
我似乎找不到关于SKAudioNode的太多信息。如何只播放一次声音?我不想重复这个声音Swift SKAudioNode只播放一次声音,swift,sprite-kit,Swift,Sprite Kit,我似乎找不到关于SKAudioNode的太多信息。如何只播放一次声音?我不想重复这个声音 我试图实现的是在spritekit中,每次子弹产生时播放一个短的激光声音。如果您试图制作声音效果,请在创建效果的sprite上使用SKAction.PlaySoundFileName(…)。SKAudioNode更适合在游戏中播放音乐 例如: //we have ship as an SKSpriteNode //lets fire laser ship.runAction(SKAction.playS
我试图实现的是在spritekit中,每次子弹产生时播放一个短的激光声音。如果您试图制作声音效果,请在创建效果的sprite上使用
SKAction.PlaySoundFileName(…)
。SKAudioNode更适合在游戏中播放音乐
例如:
//we have ship as an SKSpriteNode
//lets fire laser
ship.runAction(SKAction.playSoundFileNamed("pewpewpew.caf",waitForCompletion:false));
不幸的是,@KnightOfDragon所说的并不正确(但我没有足够的声誉来评论) iOS 9中引入了
SKAudioNode
,它是用来取代SKAction.playsoundfilename(…)
的,因为它功能更强大(您可以将其作为子级添加到SpriteKitSKNode
中,如果属性positional
设置为true,则会自动添加3D音频混音)
要使用SKAudioNode
播放一次声音,请使用以下代码:
更新
看看这里,如何在音频节点上使用操作:。文件说:
使用SKAction PlaySoundFileName:waitForCompletion:仅用于短期意外事件。
使用AVAudioPlayer播放长时间播放的背景音乐
这并不意味着
SKAudioNode
不应用于一次性音频。使用名为的播放声音文件,您无法更改音量或暂停/停止播放等。谢谢!太棒了,非常简单。如何预加载声音?现在游戏冻结0.1秒,当声音第一次响起时,我相信你可以在加载时将动作保存在自己的变量中让pewpew=SKAction.play…
,然后只需调用ship.runAction(pewpew)代码>[11/9/16]开发环境:iOS 9+和xCode 8使用此调用时存在已知内存泄漏。在苹果论坛上,您将看到一篇关于2016年4月内存泄漏的帖子,该帖子尚未修复。@cbuck12000,您可以发布链接吗?我喜欢测试这些bug,以验证是用户错误还是系统错误error@Knight0fDragon-我验证了它也在当前操作系统中,并且使用Xcode 8.0。我还没有检查Xcode 8。1@Knight0fDragon:我不同意,因为playSoundFileNamed
没有位置音频或任何其他更复杂的选项,只需简单的一键音频,无需任何控制<另一方面,code>AVFoundation
的使用更为复杂,不容易集成到SpriteKit中SKAudioNode
是一种易于使用的方式,可以将AVFoundation
集成到SpriteKit中(因为它在幕后使用AVFoundation
)。但更重要的是,我不认为,SKAudioNode
主要用于音乐,因为您可以将其用于位置音频,而位置音频不太可能用于音乐。@Juangamnik不确定您是否遇到过这个问题,但SKAudioNode在说话时就坏了(耳机错误)。在这里阅读更多@Whirlwind非常感谢,所以您的解决方案是直接使用AVAudioPlayer。对吗?对于我的背景音乐,我还是使用AVAudioPlayer,因为SKAudioNode的缺点是你不能在整个游戏(包括场景转换)中使用它。我使用SKAudioNode仅用于效果。这就是为什么我只想播放一次声音。@Juangamnik个人认为,当我需要控制声音时,我会使用AVAudioPlayer,比如背景音乐,或者可能需要在随机时刻暂停的循环(如果SKAudioNode没有中断,我会用它来代替这些循环)。否则,对于短音,我会使用SKAction.playSoundFileNamed
,不幸的是,这也是。此外,如果我需要SKAudioNode
提供的任何类型的控制,只要我能保持良好的性能,我可能会使用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
}