如何将 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) {
我正在尝试将 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) {