使用fileNamed初始化SKAudioNode返回nil

时间:2016-04-09 15:16:53

标签: ios swift sprite-kit skaudionode

这是我第一次使用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
  • iPhone with iOS 9.3.2
  • iOS 9.3模拟器

设备和模拟器都不起作用。

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)
}

现在我的应用程序不再崩溃,但它没有声音。有什么想法吗?

P.S。在我上次编辑该问题后的几分钟,我尝试用以下方法替换该方法中的所有内容:

runAction(SKAction.playSoundFileNamed(name, waitForCompletion: false))

仍然没有声音。也许声音文件存在问题?

3 个答案:

答案 0 :(得分:12)

我刚遇到这个问题。显然,它现在只适用于局部变量。以下代码有效。

var background:SKAudioNode!

override func didMoveToView(view: SKView) {
    let bg = SKAudioNode(fileNamed: "bg.mp3")
    addChild(bg)
    background = bg
}

答案 1 :(得分:0)

我在SKAudioNode(fileNamed:)上遇到了类似的问题,从自动完成功能来看,从我遇到的问题来看,好像有两个具有相同参数签名的截然不同的初始化程序,一个返回SKAudioNode,另一个返回SKNode,我莫名其妙地弄错了。我改用SKAudioNode(url:)(使用Bundle.main.url(forResource:withExtension:)获取URL),一切按预期进行。

答案 2 :(得分:0)

已经有好几年了,但是我发现构造函数SKAudioNode()花费一些时间来加载声音-不管声音多大。甚至一个50 kByte的小声音文件也需要0.25秒来加载。初次使用后,声音的所有后续加载仅花费该时间的一小部分。 我猜想SpriteKit会对应用程序文件中的所有声音进行一些缓存。

因此,要解决第一个延迟声音的问题:像在菜单上一样播放它们-音量为零,长度为零。

我的实验表明-在Xcode 11模拟器中初始化20个声音文件也需要0.25秒的时间来播放。因此,我再次猜测,预播放一个(!)声音会告诉iOS将所有声音文件预加载到内存中。