这是我第一次使用SKAudioNode。首先,我在GameScene
类的顶部声明了一个属性:
var backgroundMusic: SKAudioNode!
现在我添加了一个辅助方法:
func playBackgroundMusic(name: String) {
if backgroundMusic != nil {
backgroundMusic.removeFromParent()
}
backgroundMusic = SKAudioNode(fileNamed: name)
backgroundMusic.autoplayLooped = true
addChild(backgroundMusic)
}
现在我把这种方法称为:
playBackgroundMusic("ABC.caf")
它在这条线上抛出了一个致命错误:
backgroundMusic.autoplayLooped = true
正在说:在展开可选值时意外发现nil。
我确实确保了以下
- ABC.caf在我的项目中,列在副本捆绑包资源中
- 它拼写正确
现在,我还应该在哪里检查错误?
编辑:
以下是我的配置信息:
- Xcode 7.3
- 带有iOS 9.3.2的iPhone
- iOS 9.3模拟器
设备和模拟器都不工作。
第2版:
我将代码更改为以下代码:
func playBackgroundMusic(name: String) {
if backgroundMusic != nil {
backgroundMusic.removeFromParent()
}
let temp = SKAudioNode(fileNamed: name)
temp.autoplayLooped = true
backgroundMusic = temp
//backgroundMusic = SKAudioNode(fileNamed: "SpaceGame.caf")
//backgroundMusic.autoplayLooped = true
addChild(backgroundMusic)
}
现在我的应用程序不再崩溃,但它没有声音。有什么想法吗?
附言:在我上次编辑这个问题几分钟后,我试着用替换这个方法中的所有内容
runAction(SKAction.playSoundFileNamed(name, waitForCompletion: false))
仍然没有声音。也许是声音文件有问题?
我刚刚遇到这个问题。显然,它现在只适用于局部变量。以下代码有效。
var background:SKAudioNode!
override func didMoveToView(view: SKView) {
let bg = SKAudioNode(fileNamed: "bg.mp3")
addChild(bg)
background = bg
}
我用上面EDIT2中的代码修复了这个问题:
func playBackgroundMusic(name: String) {
if backgroundMusic != nil {
backgroundMusic.removeFromParent()
}
let temp = SKAudioNode(fileNamed: name)
temp.autoplayLooped = true
backgroundMusic = temp
//backgroundMusic = SKAudioNode(fileNamed: "SpaceGame.caf")
//backgroundMusic.autoplayLooped = true
//addChild(backgroundMusic)
runAction(SKAction.playSoundFileNamed(name, waitForCompletion: false))
}
对于没有声音的部分,只需确保iPhone上的侧开关没有处于红色。
我在SKAudioNode(fileNamed:)
上遇到了类似的问题,从自动完成和我遇到的问题来看,有两个不同的初始化程序具有相同的参数签名,一个返回SKAudioNode
,一个则返回SKNode
,但我不知怎的弄错了。我改为使用SKAudioNode(url:)
(使用Bundle.main.url(forResource:withExtension:)
获取URL),一切都按预期进行。
已经有几年了,但这次我发现构造函数SKAudioNode()加载声音需要一些时间,无论它有多大。即使是50kByte的小声音文件也需要0.25秒才能加载。在最初使用之后,所有后续的声音加载只需要该时间的一小部分。我猜SpriteKit会对应用程序文件中的所有声音进行缓存。
因此,为了解决第一个延迟声音的问题:像我在菜单上一样播放它们——音量为零,长度为零。
我的实验表明,预播放20个声音文件也需要0.25秒我的Xcode 11模拟器来初始化。所以我再次猜测,预先播放一个(!)声音告诉iOS将所有声音文件预先加载到内存中。