如何将 SKEmitterNode 添加到 SKScene(它没有显示)?

How to add an SKEmitterNode to an SKScene (it's not showing up)?

我正在尝试将 SKEmitterNode 添加到我的游戏场景 (SKScene)。我执行了以下操作但没有显示:

if let emitter = SKEmitterNode(fileNamed: "Explosion.sks") {
    emitter.position = CGPoint(x: 0, y: 0) // center of screen
    emitter.name = "boom"
    emitter.targetNode = self // setting this makes no difference
    emitter.zPosition = 10 // tried higher values also
    emitter.particleZPosition = 10 // tried with and without this too
    addChild(emitter)
    print("NODE ADDED")
}

输出打印 "NODE ADDED" 但找不到节点。所有其他节点都正常添加,没有问题。如果我用

交换上面的代码
let node = SKShapeNode(rectOf: CGSize.init(width: 50, height: 50))
node.position = CGPoint(x: 0, y: 0)
node.fillColor = SKColor.red
addChild(node)

它按预期工作,我在屏幕中央看到一个红色方块。

作为完整性检查,如果我将发射器节点添加为场景中另一个可见节点的子节点,它会显示为另一个节点的子节点:

let node = SKShapeNode(rectOf: CGSize.init(width: 50, height: 50))
node.position = CGPoint(x: 0, y: 0)
node.fillColor = SKColor.red
if let emitter = SKEmitterNode(fileNamed: "Explosion.sks") {
    emitter.position = CGPoint(x: 0, y: 0) // center of screen
    emitter.name = "boom"
    emitter.targetNode = node
    node.addChild(emitter)
}
addChild(node)

但是我不能直接将它添加到SKScene中。我可能会使用一个不可见的父节点来破解它,但这很烦人。我尝试将它包装在 SKEffectNode 中但无济于事。

iOS10.3,iPhone7模拟器,Swift3

答案很微妙:我的代码中有一个清理方法可以删除屏幕外的节点。每帧都会调用它:

self.enumerateChildNodes(withName: "*", using: { (node, stop) -> Void in
    if !self.intersects(node) {
        node.removeFromParent()
    }
})

事实证明 SKEmitterNode 永远不会 "intersects" 场景,即使它直接位于场景之上。我最初的解决方案是避免 运行 在这些特定节点上进行此检查:

if !self.intersects(node) {

变成

if !self.intersects(node) && !(node is SKEmitterNode) && !(node is SKEffectNode) {