我正在使用一个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) 我发现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播放声音的好技术是什么?
谢谢!
我决定结束与 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 序列中使用它们,并且对实现此目的的最佳方法有任何想法?
这是我第一次使用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.
我确实做了以下事情
现在还应该在哪里检查错误?
编辑:
这是我的配置信息:
设备和模拟器都不起作用.
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) 文档:
暂停()
创建一个告诉音频节点暂停播放的操作。
声明类 funpause() -> SKAction
此操作只能在 SKAudioNode 对象上执行。音频已暂停,如果重新启动,则会在暂停处恢复。此操作不可逆转。
请原谅我的无知,我只是不知道如何使用它来暂停SKAudioNode,所以没有尝试任何代码,并且没有代码可显示,因为我不知道如何使用它,并找到了这个准系统文档太轻了。