Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift SKAudioNode只播放一次声音_Swift_Sprite Kit - Fatal编程技术网

Swift 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

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


我试图实现的是在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(…)
的,因为它功能更强大(您可以将其作为子级添加到SpriteKit
SKNode
中,如果属性
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
}