我创建了一个SKEmitterNode,以便在他死后附加到我的播放器上。这是一个非常简单的烟雾。问题是,当我要么崩溃游戏时:
1)点击重试按钮并转换到同一场景,它会在随机时间以EXC_BAD_ACCESS错误导致游戏崩溃。
2)返回主屏幕并在至少死一次并创建发射器节点后点击播放并转换到该游戏场景。
目前,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)”会在您重新加载场景后导致崩溃(出现烟雾)。这是SAME方式,SKEmitterNode文档中的示例代码添加了发射器节点。
我还尝试过各种修复方法,比如在播放精灵上覆盖removeFromParent方法并在转换场景之前自己运行“removeFromParent”。
override func removeFromParent() {
self.deathSmokeEmitter?.removeFromParent()
//self.deathSmokeEmitter?.targetNode = nil
super.removeFromParent()
}
执行此操作后,只有在首先返回主屏幕然后转换回游戏场景时才会发生崩溃。这意味着如果被注释掉的话,我可以一次又一次地快速重试,但如果我回到家庭场景并返回游戏场景,它仍然会崩溃。此外,当它以这种方式崩溃时,堆栈跟踪会在崩溃之前显示最后一个方法:
[SKEffectNode dealloc]
如果您有任何想法和感谢,请告诉我们!
PS:我在过渡期间没有做任何奇怪的事。我只是实例化一个过渡并推动下一个场景。我依靠SpriteKit为我照顾所有的清洁工作。
答案 0 :(得分:1)
所以我发现了如何解决这个问题(当我提出这个问题时我几乎已经弄明白了)但是为了澄清,我输入了它。
出于某种原因,iOS 8中的SpriteKit在切换场景时不会从Player精灵中移除烟雾发射器。这会以某种方式导致崩溃,因为它出于某种原因试图在下一个场景中对它做一些逻辑。
我上面的内容几乎是正确的。首先使用粒子发射子child的removeFromParent()方法覆盖sprite,如下所示
// Sprite with ParticleEmitterNode child attached to it's method
override func removeFromParent() {
self.deathSmokeEmitter?.removeFromParent()
super.removeFromParent()
}
在切换场景之前,只需执行一个spriteWithEmitterChild.removeFromParent()从场景中删除精灵(发射器作为子场),这将调用重写方法并从精灵中移除烟雾发射器,然后从精灵中移除精灵。现场。