1

プレイヤーが死亡した後、プレイヤーにアタッチする SKEmitterNode を作成しました。とてもシンプルな燻製です。問題は、次のいずれかのときにゲームがクラッシュすることです。

1) リトライ ボタンを押して同じシーンに遷移すると、ランダムな時間に EXC_BAD_ACCESS エラーでゲームがクラッシュします。

2) ホーム画面に戻り、プレイを押して、少なくとも 1 回死亡し、エミッタ ノードを作成した後、そのゲーム シーンに移行します。

現在、SKEMitterNode はオプションのクラス変数です。プレイヤーが死亡すると、SKEMitterNode をセットアップしてシーンにアタッチします。

    // Add death smoke
    let smokePath: String = NSBundle.mainBundle().pathForResource("playerDeathSmoke", ofType: "sks")!
    self.deathSmokeEmitter = NSKeyedUnarchiver.unarchiveObjectWithFile(smokePath) as? SKEmitterNode
    self.deathSmokeEmitter?.name = "deathSmokeEmitter"
    if let deathEmitter = self.deathSmokeEmitter {
        deathEmitter.targetNode = self.scene
        self.addChild(deathEmitter)
    }

「self.addChild(deathEmitter)」は、シーンをリロードした後にクラッシュします (煙は表示されます)。これは、SKEMitterNode ドキュメントのサンプル コードがエミッタ ノードを追加する方法と同じです。

また、Player スプライトの removeFromParent メソッドをオーバーライドし、シーンを移行する前に自分で「removeFromParent」を実行するなど、さまざまな修正を試みました。

    override func removeFromParent() {
         self.deathSmokeEmitter?.removeFromParent()
         //self.deathSmokeEmitter?.targetNode = nil

         super.removeFromParent()
     }

これを行った後、最初にホーム画面に戻ってからゲームシーンに戻るときにのみクラッシュが発生します。つまり、それがコメントアウトされていれば、何度でも何度でもクイック リトライを実行できますが、ホーム シーンに戻ってゲーム シーンに戻ると、やはりクラッシュします。また、このようにクラッシュすると、クラッシュする前の最後のメソッドがスタック トレースに表示されます。

 [SKEffectNode dealloc]

アイデアや感謝があれば教えてください!

PS: トランジション中は何も変なことはしません。トランジションをインスタンス化し、次のシーンをプッシュするだけです。私は SpriteKit に頼って、すべてのクリーニングを処理してもらいました。

4

1 に答える 1

1

だから私はこれを修正する方法を見つけました(私が質問したときにほとんど理解していました)が、明確にするためにそれを入力します.

何らかの理由で、iOS 8 の SpriteKit は、シーンを切り替えたときにプレーヤー スプライトからスモーク エミッターを削除しません。これは、何らかの理由で次のシーンで何らかのロジックを実行しようとするため、何らかの理由でクラッシュを引き起こします。

私が上に持っていたものはほとんど正しかった。最初に、このようにパーティクル エミッタの子の removeFromParent() メソッドでスプライトをオーバーライドします。

// Sprite with ParticleEmitterNode child attached to it's method
override func removeFromParent() {
     self.deathSmokeEmitter?.removeFromParent()

     super.removeFromParent()
 }

シーンを切り替える前に、spriteWithEmitterChild.removeFromParent() を実行してシーンからスプライト (エミッターを子として) を削除します。これにより、オーバーライドされたメソッドが呼び出され、シーンからスプライトを削除する前にスプライトから煙エミッターが削除されます。

于 2015-06-30T17:37:53.233 に答える