プレイヤーが死亡した後、プレイヤーにアタッチする 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 に頼って、すべてのクリーニングを処理してもらいました。