SKAudioNode 播放声音一次

Posted

技术标签:

【中文标题】SKAudioNode 播放声音一次【英文标题】:SKAudioNode play sound once 【发布时间】:2015-12-18 14:58:34 【问题描述】:

我似乎找不到关于 SKAudioNode 的太多信息。如何只播放一次声音?我不想重复这个声音。

我想要完成的是在 spritekit 中每次产生子弹时播放短促的激光声。

【问题讨论】:

【参考方案1】:

不幸的是,@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

更新

看看这里,如何在音频节点上使用动作:SKAction->Audio-Stuff。文档说:

使用 SKAction playSoundFileNamed:waitForCompletion: 仅用于短杂音。 使用 AVAudioPlayer 播放长时间运行的背景音乐。

意味着不应将SKAudioNode 用于一次性音频。使用playSoundFileNamed,您无法更改音量或暂停/停止播放等。

【讨论】:

@Knight0fDragon:我不同意,因为playSoundFileNamed 没有定位音频或任何其他更复杂的选项,并且旨在用于无需任何控制的简单单次音频。另一方面,AVFoundation 使用起来更复杂,也不容易集成到 SpriteKit 中。 SKAudioNode 是将AVFoundation 集成到SpriteKit 中的一种易于使用的方法(因为它在幕后使用AVFoundation)。但更重要的是,我不认为 SKAudioNode 主要用于音乐,因为您可以将其用于定位音频,而这不太可能用于音乐。 @Juangamnik 不确定您是否遇到过这个问题,但 SKAudioNode 在说话的那一刻坏了(耳机错误)。在此处阅读更多信息***.com/q/35662139/3402095 @Whirlwind 非常感谢您,所以您的解决方案是直接使用 AVAudioPlayer。对?对于我的背景音乐,我无论如何都使用 AVAudioPlayer,因为 SKAudioNode 的缺点是您无法在整个游戏(包括场景转换)AFAIK 期间使用它。我只使用 SKAudioNode 来制作效果。这就是为什么我只想播放一次声音。 @Juangamnik 就我个人而言,当我需要控制声音时,我会使用 AVAudioPlayer,比如背景音乐,或者可能需要在随机时刻暂停的循环(如果 SKAudioNode 没有损坏,我会用它来代替那些循环)。否则,意味着短声音,我使用SKAction.playSoundFileNamed,不幸的是,也是buggy。 另外,如果我需要SKAudioNode 提供的任何形式的控制,我可能会使用SKAudioNode,即使是短声音,只要我能保持良好的性能......【参考方案2】:

如果您尝试制作音效,请在创建音效的精灵上使用SKAction.playSoundFileNamed(...)。 SKAudioNode 更适合在游戏中播放音乐

例子:

//we have ship as an SKSpriteNode

//lets fire laser

ship.runAction(SKAction.playSoundFileNamed("pewpewpew.caf",waitForCompletion:false));

【讨论】:

谢谢!太棒了,非常简单。我将如何预加载声音?现在游戏在第一次发出声音时会冻结 0.1 秒 我相信您可以在加载时将操作保存在自己的变量中let pewpew = SKAction.play....,然后只需调用ship.runAction(pewpew); [11/9/16] 开发环境:iOS 9+ 和 xCode 8 使用此调用存在已知的内存泄漏。在 Apple 论坛上,您会在 2016 年 4 月看到一篇关于内存泄漏的帖子,该帖子尚未修复。 @cbuck12000,你能发个链接吗?我喜欢测试这些错误来验证是用户错误还是系统错误 @Knight0fDragon - forums.developer.apple.com/thread/20014 我验证它也在当前的操作系统和 Xcode 8.0 中。我还没有检查 Xcode 8.1

以上是关于SKAudioNode 播放声音一次的主要内容,如果未能解决你的问题,请参考以下文章

插入/拔出耳机时 SKAudioNode() 崩溃

一次只能播放一个声音片段

Jquery 只播放一次声音

只播放一次声音 Jquery

Sound Pool 只播放一次声音

Swift,如何通过按下按钮一次又一次地播放声音