【问题标题】:Keeping particles after emitter is destroyed在发射器被破坏后保留粒子
【发布时间】:2014-12-08 16:04:16
【问题描述】:

在我的 SK 游戏中,我有火箭发射,每个火箭都有一个 SKEmitterNode,它会产生烟雾轨迹效果。一旦火箭击中我称之为removeFromParent 的东西,这也会移除发射器,从而立即移除烟雾痕迹。我希望烟雾痕迹一直存在,直到颗粒消散。

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

我尝试了很多很多不同的方法,但都没有奏效。

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

【问题讨论】:

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

标签: sprite-kit skemitternode


【解决方案1】:

我终于想出了如何做到这一点,但花了一些时间,有些东西我还是不太明白。但是,它有效。

我必须创建几个发射器。我的直升机可以在必须重新加载之前发射 X 枚火箭(这需要一段时间),所以我刚刚创建了那么多发射器作为 iVar。因此,每个火箭都有自己的发射器。

仍然,我无法将发射器添加为火箭的子代,否则它会在火箭出现时被摧毁。所以,在我的更新方法中,我创建了一个 switch 语句。我创建了一个新的 iVar int 来保存正在使用哪个发射器的指示器。在每个开关case 中,我都会告诉 Sprite Kit 将那个发射器放在火箭的正后方。

因此,只要火箭在飞行中,switch 语句就会检查哪个发射器应该“附加”到火箭上,并在每一帧更新其位置。最终的结果是发射器与火箭保持连接,但不是儿童。

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

当直升机重新加载时,我会从其父级移除所有发射器,以便稍后重新分配它们。

最后,每次火箭发射时我都必须resetSimulation,这样就不会立即出现大烟道。

这就是我让它工作的方式。

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多