2017-03-18 3 views
2

サウンドが再生されているときにいつも私のアプリがクラッシュする背景を理解できない。ここにサウンドがない場合、アプリはクラッシュしません。 私はSKActionを演奏しています。 static letActionsクラスにあらかじめ読み込んでstatic funcと呼び出して、SKActionを返します。だから私は完成レベルの音を持っています。それが再生すると、私はホームボタンを押すと、彼らはアプリに戻ってくる。アプリ「スレッド1:EXC_BAD_ACCESS(コード= 1、アドレス= 0xff8e9abc)」でクラッシュしました。誰がここで何が起こっているのか考えていますか?私のスプライトキットゲームの未完成のサウンドのために私のアプリがクラッシュする

これは私の構造体がActionsと呼ばれている:

public struct Actions { 
    static let completionSound = SKAction.playSoundFileNamed("CompletionSound.mp3", waitForCompletion: false) 

    static func playCompletionSound() -> SKAction { 
     return completionSound 
    } 
} 

ここに私のクラスでGridと呼ばれる、私はレベルが完了したかどうかの条件があります。そこ

class Grid { 
    var delegate: GridDelegate? 
    private var completed: Bool = false 
    ... 

    ... 
    private func completeLevel() { 
     if completed { 
      let waitAction = SKAction.wait(forDuration: 1.5) 
      let blockAction = SKAction.run { 
       let groupAction = self.settings.sound ? SKAction.group([Actions.playGridSwishSound(), Actions.removeGridAction()]) : Actions.removeGridAction() 
       self.gridNode.run(groupAction, completion: { 
        self.gridNode.removeAllChildren() 
        self.delegate?.completionLevel() 
       }) 
      } 
      let seq = SKAction.sequence([waitAction, blockAction]) 
      run(groupAction) 
     } 
    } 

を私はSKLabelNodeを示しノードを、持っています「COMPLETED」というテキストが表示されます。私は最後のもののデリゲートであるgridインスタンスを、持っているgameNode

class CompletionNode: SKNode { 
    private let completionLabel = SKLabelNode(fontNamed: MainFont) 

    init(settings: Settings) { 
     self.settings = settings 
     super.init() 
     isUserInteractionEnabled = false 

     completionLabel.text = Titles.CompletedTitle 
     completionLabel.fontSize = 46.0 
     completionLabel.fontColor = GoldenColor 
     completionLabel.centering() 
     completionLabel.position = CGPoint(x: 0.0, y: 0.0) 
     completionLabel.xScale = 0.0 
     completionLabel.yScale = 0.0 
     completionLabel.alpha = 0.0 

     addChild(completionLabel) 
    } 

    func animate(completion: @escaping() ->()) { 
     let waitAction = Actions.waitAction(duration: 0.2) 
     let scaleAction = SKAction.scale(to: 1.0, duration: 0.4) 
     scaleAction.timingMode = .easeInEaseOut 
     let fadeInAction = Actions.fadeInAction(duration: 0.4) 
     fadeInAction.timingMode = .easeIn 
     let groupAction = SKAction.group([scaleAction, fadeInAction]) 

     let llBlock = SKAction.run { 
      self.completionLabel.run(groupAction) 
     } 

     let seq = SKAction.sequence([waitAction, llBlock]) 
     run(seq, completion: completion) 
    } 
} 

、私はシーンにcompletionNodeを追加:私はレベルの終わりに達すると

class GameScene: SKNode { 
    var gird: Grid? 
    let hudNode = HUDNode() 
    let completionNode = CompletionNode() 
    var completionOn = false 
    ... 
    init() { 
     super.init() 
     grid = Grid() 
     grid!.delegate = self 
     grid!.position = CGPoint(x: 0.0, y: 0.0) 
     addChild(grid!) 

     hudNode.position = CGPoint(x: 0.0, y: MainSize.height * 0.44) 
     hudNode.zPosition = 40.0 
     hudNode.delegate = self 
     addChild(hudNode) 

     completionNode.alpha = 0.0 
     completionNode.position = CGPoint(x: 0.0, y: 0.0) 
     completionNode.zPosition = 60.0 
     addChild(completionNode) 
    } 

    internal func completeLevel() { 
     addCompletionScene() 
    } 

    private func addCompletionNode() { 
     run(Actions.playCompletionSound()) 
     completionNode.alpha = 1.0 
     completionNode.animate { 
      self.completionOn = true 
      self.hudNode.isUserInteractionEnabled = true 
     } 
    } 
} 

は、私は、その後、ホームボタンを押してくださいクラッシュが起こった後、私のゲームに戻ってきてください。

+0

問題が疑われるところにコードを入れてください –

+0

Laura Calinoiu私はコード例で私の質問を更新しました。 –

+0

例外ブレークポイントを設定して、クラッシュの原因となっているコード行を特定します。 – Whirlwind

答えて

1

playSoundFileNamedには、アプリケーション/ゲームがフォアグラウンドモードとバックグラウンドモードの間で移行している間にオーディオセッションを維持できないようです。

実装によっては、中断後にアプリケーションを再開した後、ミュート再生からサウンド資産の読み込みに失敗したり、ケースのようにプレーンクラッシュに至るまでの予測できない動作が発生します。ここで

同様の問題を論じトピックです:SKAction playSoundFileNamed doesn't work after receiving two consecutive phone calls

私はplaySoundFileNamedアクションの使用を停止し、代わりにサウンドファイルを再生するためAVAudioPlayerを使用することをお勧めします。それを構成するのにもっと多くの努力が必要ですが、それは長い間ずっと続き、完璧に動作しています。

+0

このソリューションをお寄せいただきありがとうございますStoyan!このコードをAVFoundationで記述するのに最適な場所はどこですか?たとえば:ViewControllerまたはGameSceneでサウンドをプリロードする。 –

+1

私の見解では、AVFoundationはリソース集約型のフレームワークです。私が見たサンプルコードは、通常、シングルトンに入れられます。私は自分自身で、オーディオエンジンの初期化、音楽やサウンドのロードとアンロード、loadMusic、playMusic、pauseMusic、playSound(named :)などの他のクラスで使用できるメソッドを公開するGameAudioというシングルトンを作成します。 – Stoyan

+0

多くのStoyanに感謝します! –

関連する問題