【问题标题】:SKEmitterNode change particle speed to particles already emittedSKEmitterNode 将粒子速度更改为已发射的粒子
【发布时间】:2014-02-17 21:09:59
【问题描述】:

是否可以改变已经发射的粒子的速度? SKEmitterNode 有一个particleSpeed 属性,但这仅适用于将来发射的粒子。

例如,假设我们正在构建一个宇宙飞船模拟器。想象一下在星空之上渲染的宇宙飞船。星空是通过粒子文件创建的,使用 SKEmitterNode 渲染。通过这个模拟的宇宙飞船永远不会改变位置。 SKEmitterNode 由在负 x 方向上以 10 的恒定速度移动的粒子组成。为了模拟宇宙飞船的加速,如果能够改变已经发射的粒子的速度,那就太好了。目前,如果粒子的速度发生变化,已经发射的粒子的速度将比速度变化后正在发射的粒子慢。

一种解决方案是定义一个粒子系统,该系统在例如 100 x 100 的范围内以 0 速度和 0 加速度发射粒子。该粒子系统将使用较低的 zPosition 值渲染以保持在背景中。为了模拟飞船运动,SKEmitterNode 的 x 位置将相对于飞船的速度发生变化。更多的 SKEmitterNode 被添加到场景之外,然后随着旧的 SKEmitterNode 滚落并被移除,滚动到视图中。

我已经测试过该解决方案并且它有效,但我很好奇是否有人有更优雅的解决方案。

【问题讨论】:

  • 据我所知这是不可能的。来自文档:“粒子精灵归 Sprite Kit 私有——您的游戏无法访问生成的精灵。” - (developer.apple.com/library/ios/documentation/SpriteKit/…)
  • 您绝对是对的,但我希望 SKEmitterNode(这些粒子的所有者)对这类事情有一些选择。这使得这些粒子系统在这方面看起来非常有限。

标签: ios iphone objective-c ios7 sprite-kit


【解决方案1】:

您可能可以创建第二个SKEmitterNode,它具有相同的样式且速度更快。然后运行SKActionSKAction sequence 在两者之间进行转换。

【讨论】:

    【解决方案2】:

    一种可能的解决方法是将粒子添加到单独的层(空 SKNode)。

    var particleLayer = SKNode()
    self.addChild(particleLayer)
    
    var flowEmitter = SKEmitterNode(fileNamed: "yourEmitter.sks")
    emitter?.targetNode = particleLayer
    

    然后您可以通过使用 SKAction 移动该层来更改粒子速度。

    particleLayer.run(.move(by: CGVector(dx: 100, dy: 0), duration: 5.0))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      相关资源
      最近更新 更多