我有一个需要在后台播放音频的应用程序...
使用Swift和SpriteKit的SKActions是否可以实现这一点...
或者还有其他方式可以实现吗...
指点一下方向会非常有帮助。
SKAction
非常易于与声音一起使用,但有时您可能需要更多的功能。
在这种情况下,您将希望使用AVAudioPlayer
而不是SKAction
。
为了不编写自己的“播放器”,我建议您使用现有的播放器。这是我已经使用过的一个(SKTAudio):https://github.com/raywenderlich/SKTUtils/blob/master/SKTUtils/SKTAudio.swift
以下是如何使用它:
// For background audio (playing continuously)
SKTAudio.sharedInstance().playBackgroundMusic("yourBackgroundMusic.mp3") // Start the music
SKTAudio.sharedInstance().pauseBackgroundMusic() // Pause the music
SKTAudio.sharedInstance().resumeBackgroundMusic() // Resume the music
// For short sounds
SKTAudio.sharedInstance().playSoundEffect("sound.wav") // Play the sound once
正如您所看到的,您可以播放短音频(就像您可能已经使用SKAction
做过的那样),甚至是背景音乐,它将循环播放,而您正在寻找。
尝试了几种方法后,我偶然发现了一个合理的解决方案。要循环播放音乐,您可以设置一个SKAudioNode并将AutoPlayedLoop = true。然后在场景加载时调用“play music”方法。
现在,如果您想要一个声音效果,您也可以使用SKAudioNode。我发现声音效果开始重复,为了抵消这一点,我简单地创建了一个播放-停止序列。基本上,每次触发声音效果时,它都会运行此序列,因此,它只会按预期播放一次。然而,声音效果有一个截止时间,所以我创建了一个简单的颜色阴影方法,大约1秒钟,并将其添加到序列中。现在,序列产生的是play-shade-stop。每次声音效果运行此序列时,休眠的阴影动作会给它一个1秒钟的延迟,并允许它完全播放,然后它会像预期的那样停止。根据声音效果,您可以使用休眠的阴影动作进行必要的补偿,有时更长,有时更短。
好吧,这就是代码。它非常简单,您不需要为此创建整个AVPlayer类。
func playerhitfx() {
let fx:SKAudioNode = SKAudioNode(fileNamed: "playerfx")
let play: SKAction = SKAction.play()
let stop: SKAction = SKAction.stop()
let shade: SKAction = SKAction.colorize(with: UIColor.clear, colorBlendFactor: 1, duration: 1)
let volume: SKAction = SKAction.changeVolume(to: 3, duration: 0)
let seq: SKAction = SKAction.sequence([play,shade,stop])
fx.run(seq)
fx.run(volume)
self.addChild(fx)
}