在iOS9中无法重复使用具有不同父节点的发射器节点

时间:2015-10-13 00:32:40

标签: sprite-kit swift2 ios9 skemitternode

我正在尝试合并粒子发射器节点。我需要它们从旧的父节点中删除它们并将它们作为SKSpriteNode的子节点添加到新位置时重新使用它们。我将发射器节点位置设置为0,0因此发射器应出现在其新的父精灵节点的中心。

第一次将它们作为子项添加到精灵节点时,发射器会正确显示,但只是在后续尝试时不显示。这在iOS8中都运行良好,只在iOS9中被破坏(在iOS9中似乎有很多粒子发射器错误?)

这是我需要放置粒子效果时代码的基本示例:

if emitter.parent != nil {
    emitter.removeFromParent()
}

newLocationSpriteNode.addChild(emitter)

emitter.resetSimulation()

这在iOS8中完美运行 - 我可以在新位置重新使用我的发射器节点。在iOS9中,节点仅在此代码第一次运行时出现,并且在此之后再也不会显示。您是否了解我如何解决此问题?谢谢!

1 个答案:

答案 0 :(得分:2)

我遇到了和你描述的完全相同的问题。第二次重新连接时,发射器不可见。但是ios8上的一切都运行良好。经过几个小时的不同设置实验后,我几乎放弃了..但是,我找到了一个现在有效的解决方案。首先,我有一个SKEmitterNodes池,我在游戏过程中重复使用它。此方法从池(数组)中获取发射器并将其添加到游戏性层(SKNode):

    func createExplosion(position: CGPoint) {

      let emitter = _pool.borrowDirtEmitter()

      emitter.resetSimulation() //Important
      emitter.position = position
      emitter.targetNode = self //Important

      if emitter.parent == nil {
        self.addChild(emitter)
      }
  }

所以这里的“self”是我附加发射器的实际节点。当节点在屏幕外时,我清理发射器(和其他对象):

        if let dirtEmitter = childNode as? SKEmitterNode {
            if dirtEmitter.parent != nil {
                dirtEmitter.removeFromParent()
            }
            dirtEmitter.targetNode = nil //Important!
            _pool.returnDirtEmitter(dirtEmitter)
        }

我还没有时间详细介绍,但“重要”评论应该给你一些指示。我将尝试测试一种方法,使用一个动作从父母那里删除(在x秒之后),但是因为我制作了一个侧卷轴,所以当发射器现在在屏幕外时,我可以放弃清理。

希望这会有所帮助..