标签: skaudionode

插入/拔出耳机时SKAudioNode()崩溃

我正在使用一个SKAudioNode()在我的游戏中播放背景音乐.我有一个播放/暂停功能,一切正常,直到我插入耳机.根本没有声音,当我调用暂停/播放功能时,我收到此错误

AVAudioPlayerNode.mm:333:开始:必需条件为false:_engine-> IsRunning()com.apple.coreaudio.avfaudio',原因:'必需条件为false:_engine-> IsRunning()

有谁知道这意味着什么?

码:

import SpriteKit

class GameScene: SKScene {

let loop = SKAudioNode(fileNamed: "gameloop.mp3")
let play = SKAction.play()
let pause = SKAction.pause()
var isPlaying = Bool()

override func didMoveToView(view: SKView) {  
    loop.runAction(play)
    isPlaying = true
    self.addChild(loop)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    _ = touches.first as UITouch!

    for _ in touches {
        if isPlaying {
            loop.runAction(pause)
            isPlaying = false
        } else {
            loop.runAction(play)
            isPlaying = true
        } 
    }
}
}
Run Code Online (Sandbox Code Playgroud)

sprite-kit swift avaudioengine swift2 skaudionode

12
推荐指数
1
解决办法
889
查看次数

如何使用SKAudioNode

我发现SKAction playSoundFileNamed是否在IOS 9中发生内存泄漏:https ://forums.developer.apple.com/thread/20014

他们建议使用SKAudioNode,但是示例很快,我在项目中使用了Objective-c。

例:

func testAudioNode() {  
    let audioNode = SKAudioNode(fileNamed: "LevelUp")  
    audioNode.autoplayLooped = false  
    self.addChild(audioNode)  
    let playAction = SKAction.play()  
    audioNode.runAction(playAction)  
}  
Run Code Online (Sandbox Code Playgroud)

我试过的

-(void)testSound{
testSound = [SKAudioNode nodeWithFileNamed:@"test.wav"];
testSound.autoplayLooped = false;
[self addChild:testSound];

SKAction *playaction = [SKAction play];

[testSound runAction:playaction];
}
Run Code Online (Sandbox Code Playgroud)

它将崩溃为:

[self addChild:testSound];
Run Code Online (Sandbox Code Playgroud)

那么,我将如何工作呢?仅在iOS 9>中使用SKAudioNode播放声音,而在较早版本中使用SKAction播放声音的好技术是什么?

谢谢!

objective-c ios sprite-kit skaudionode

6
推荐指数
1
解决办法
2674
查看次数

为 SKAudioNode 创建 SKAction 扩展

我决定结束与 SKAction.playSoundFileNamed 的痛苦关系,转而在我们的项目中使用 SKAudioNodes —— 突破点是它们完全被中断所破坏,没有任何一致性。

我们正在尝试创建 SKAction 的扩展,它将模仿播放 SKAudioNodes 而不增加延迟,类似于将 playSoundFileNamed 中的 waitForCompletion 属性设置为 false 时。但是,我们添加 SKAudioNode,然后在短时间内(3.0 秒)后将其处置,但在扩展中,这将为任何操作添加 3.0 秒的延迟。我认为我们必须有这个延迟然后删除,否则我们会不必要地积累 SKAudioNodes。这是我们当前的代码:

func playAudioNode(node: SKSpriteNode?, sound: SoundType, delay: Double)
{
    if node == nil
    {
        return
    }

    let audioNode = audioNodeDictionary[sound]!.copy() as! SKAudioNode

    node!.addChild(audioNode)

    let playSound = SKAction.run
    {
        audioNode.run(.play())
    }

    node!.run(SKAction.sequence([SKAction.wait(forDuration: delay), playSound, SKAction.wait(forDuration: 3.0), SKAction.removeFromParent()]))
}
Run Code Online (Sandbox Code Playgroud)

是否有人以类似的临时方式使用 SKAudioNodes 并在 SKAction 序列中使用它们,并且对实现此目的的最佳方法有任何想法?

sprite-kit skaction swift-extensions skaudionode

5
推荐指数
0
解决办法
145
查看次数

使用fileNamed初始化SKAudioNode返回nil

这是我第一次使用SKAudioNode.首先,我在我GameScene班级的顶部宣布了一个属性:

var backgroundMusic: SKAudioNode!
Run Code Online (Sandbox Code Playgroud)

现在我添加了一个帮助方法:

func playBackgroundMusic(name: String) {
    if backgroundMusic != nil {
        backgroundMusic.removeFromParent()
    }

    backgroundMusic = SKAudioNode(fileNamed: name)
    backgroundMusic.autoplayLooped = true
    addChild(backgroundMusic)
}
Run Code Online (Sandbox Code Playgroud)

现在我这样调用这个方法:

playBackgroundMusic("ABC.caf")
Run Code Online (Sandbox Code Playgroud)

它在这一行引发致命错误:

backgroundMusic.autoplayLooped = true
Run Code Online (Sandbox Code Playgroud)

说:在解开可选值时意外发现nil.

我确实做了以下事情

  • ABC.caf在我的项目中,并列在复制包资源中.
  • 拼写正确.

现在还应该在哪里检查错误?

编辑:

这是我的配置信息:

  • Xcode 7.3
  • 带iOS 9.3.2的iPhone
  • 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)
} …
Run Code Online (Sandbox Code Playgroud)

ios sprite-kit swift skaudionode

4
推荐指数
2
解决办法
1045
查看次数

如何使用/实现pause()来暂停SKAudioNode?

文档:

暂停()

创建一个告诉音频节点暂停播放的操作。

声明类 funpause() -> SKAction

此操作只能在 SKAudioNode 对象上执行。音频已暂停,如果重新启动,则会在暂停处恢复。此操作不可逆转。

请原谅我的无知,我只是不知道如何使用它来暂停SKAudioNode,所以没有尝试任何代码,并且没有代码可显示,因为我不知道如何使用它,并找到了这个准系统文档太轻了。

audio sprite-kit skaudionode

3
推荐指数
1
解决办法
381
查看次数