5

这是我第一次使用 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)
}

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

PS 在我上次编辑该问题后几分钟,我尝试将该方法中的所有内容替换为:

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

还是没有声音。也许声音文件有问题?

4

4 回答 4

13

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

var background:SKAudioNode!

override func didMoveToView(view: SKView) {
    let bg = SKAudioNode(fileNamed: "bg.mp3")
    addChild(bg)
    background = bg
}
于 2016-04-14T22:39:34.090 回答
1

I fixed this problem with the code I put in EDIT2 above:

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

For the no sound part just make sure the side switch on your iPhone is not on red.

于 2016-04-11T10:20:31.607 回答
1

已经有好几年了,但是我发现构造函数 SKAudioNode() 需要一些时间来加载声音——不管它有多大。即使是 50 kByte 的小声音文件也需要 0.25 秒才能加载。在初次使用之后,所有随后的声音加载只需要一小部分时间。我猜 SpriteKit 会对应用文件中的所有声音进行一些缓存。

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

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

于 2019-11-10T16:39:13.723 回答
1

我遇到了类似的问题,SKAudioNode(fileNamed:)从自动完成和我遇到的问题来看,有两个不同的初始化程序具有相同的参数签名,一个返回SKAudioNode一个返回SKNode,我不知何故弄错了。我改用 using SKAudioNode(url:)(使用 获取 URL Bundle.main.url(forResource:withExtension:)),一切都按预期工作。

于 2019-07-06T08:38:31.733 回答