Sprite kit 在发射器被破坏后保留粒子

Sprite kit 在发射器被破坏后保留粒子,sprite-kit,skemitternode,Sprite Kit,Skemitternode,在我的SK游戏中,我有发射的火箭,每个火箭都有一个可以产生烟迹效果的SKEmitterNode。一旦火箭击中我称之为removeFromParent的东西,这也会移除发射器,从而立即移除烟雾轨迹。我想让烟迹留在周围直到粒子消散 我不明白的是,为什么即使将targetNode设置为self.scene,也不会发生这种情况。我已经获取了发射器节点,创建了一个包含其所有子节点的数组,并调用count来记录它有多少子节点,然后返回。。零似乎所有粒子都应该是场景本身的子对象,因此当发射器从场景中移除时,它

在我的SK游戏中,我有发射的火箭,每个火箭都有一个可以产生烟迹效果的SKEmitterNode。一旦火箭击中我称之为removeFromParent的东西,这也会移除发射器,从而立即移除烟雾轨迹。我想让烟迹留在周围直到粒子消散

我不明白的是,为什么即使将targetNode设置为self.scene,也不会发生这种情况。我已经获取了发射器节点,创建了一个包含其所有子节点的数组,并调用count来记录它有多少子节点,然后返回。。零似乎所有粒子都应该是场景本身的子对象,因此当发射器从场景中移除时,它的粒子不应该是,因为它们不是它的子对象

我尝试了很多很多不同的方法,但都没有成功


我只想让每枚火箭都有一个发射器,发射器会留下烟迹,当火箭被摧毁时,烟迹会随着它的消散而保留下来。但是我不能在火箭上调用removeFromParent而不破坏它的发射器

我终于想出了办法,但这需要一些技巧,有些东西我还不太明白。然而,它是有效的

我必须创建几个发射器。我的直升机在重新装填之前可以发射X个数量的火箭,这需要一段时间,所以我只是创建了那么多发射器作为IVAR。因此,每枚火箭都有自己的发射器

尽管如此,我还是不能在火箭出生时添加发射器,否则它会在火箭发射时被摧毁。因此,在我的update方法中,我创建了一个switch语句。我创建了一个新的iVar int来保存发射器所使用的指示器。在每一个开关的情况下,我会告诉精灵套件采取发射器,并把它的权利后面的火箭

因此,每当火箭飞行时,switch语句都会检查哪个发射器应该连接到火箭,并在每一帧更新其位置。最终的结果是,发射器与火箭保持连接,但不是孩子

然后,在我的didBeginContact方法中,我在接触火箭时摧毁它,并告诉它的发射器停止发射粒子,setNumParticlesToEmit:1

当直升机通过重新装载时,我会从它们的父母那里移除所有发射器,以便以后可以重新分配它们

最后,我必须重新设置每次火箭发射的模拟,这样就不会立即出现大的烟迹


我就是这样让它工作的。

您可以手动使烟雾看起来消散。这个想法是。。。火箭击中目标,强制延迟,减少发射的节点数量,强制延迟,减少发射的节点数量,重复,直到需要,然后移除发射器。您可以通过一系列的操作来实现这一点。如果您对这种方法感兴趣,我可以在一个小时左右添加一个带有代码的答案。它不需要太多的代码。让发射器节点成为火箭的一个属性。将发射器作为子对象添加到场景中。当火箭爆炸时,移除火箭。或者,将发射器保持为火箭的子对象,只需将火箭alpha设置为0,这使其完全透明,然后在发射器消散后移除火箭。第一种方法仍然不会产生消散效果。第二种方法不会产生耗散效果,它也会产生相同的效果,即粒子在移除发射器时消失,并且也会使火箭容易受到接触事件和碰撞的影响,除非你更改类别BitMask。我刚刚解决了第一个问题。很明显,如果他想降低它,他必须通过减少编码的particleBirthRate来做到这一点。更改碰撞状态也是一个给定的问题。我的两种解决方案都解决了这个问题。每一个额外的问题都应该在imo中单独提出,而不是为他编写游戏代码,这就是为什么我只是给出了解决最初问题的建议。这两种方法都会奏效。移除发射器后保留发射器粒子-不可能。