3

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

发射器第一次作为子节点添加到精灵节点时会正确显示,但在随后的尝试中根本不会显示。这一切在 iOS8 中运行良好,仅在 iOS9 中被破坏(在 iOS9 中似乎有很多粒子发射器错误?)

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

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

newLocationSpriteNode.addChild(emitter)

emitter.resetSimulation()

这在 iOS8 中完美运行——我可以在新位置重复使用我的发射器节点。在 iOS9 中,节点仅在此代码第一次运行时出现,之后不再出现。您对我如何解决此问题有任何见解吗?谢谢!

4

1 回答 1

2

我遇到了与您描述的完全相同的问题。第二次重新连接时,发射器不可见。不过,在 ios8 上一切正常。在尝试了几个小时的不同设置后,我几乎放弃了。但是,我找到了一个现在可以使用的解决方案。首先,我有一个 SKEmitterNode 池,可以在游戏过程中重复使用。此方法从池(数组)中抓取一个发射器并将其添加到游戏层(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 秒后),但由于我正在制作一个横向滚动条,因此我现在可以在发射器不在屏幕时进行清理。

希望这可以帮助..

于 2015-10-27T22:58:11.380 回答