【问题标题】:How to rewind time of SKEmitterNode?SKEmitterNode如何倒带时间?
【发布时间】:2019-10-25 12:49:28
【问题描述】:

我正在尝试使粒子(使用 SKEmitterNode 实现)符合游戏中的时间倒带功能。我怎样才能做到这一点?

从文档看来,访问单个粒子似乎不是一种可能的解决方案,唯一可能有用的属性是 particleAction。但是,我仍然不知道如何使用单个操作来实现这一目标。

如果这不可行,我认为有必要从头开始为游戏实现一个更简单的动画版本。对此的任何建议也将不胜感激。

【问题讨论】:

  • 您希望粒子突然反转方向然后消失在最初出现的位置吗?我很确定在发射器框架内没有直接的方法。不过有几个想法: 1. 如果您可以将效果编写为具有单个纹理或几个纹理的 SKShader,那么您可以拥有一个“反向”着色器来向后运行(需要一些技巧来有效地倒带 u_time,但我知道该怎么做)。 2. 也许您可以使用 SKView 的纹理(来自:)从发射器获取帧,然后使用这些纹理反向设置动画。
  • @bg2b 感谢您的评论!第一种方法看起来很有趣,但是(如果我错了,请纠正我)需要为每个不同的粒子实现不同的着色器,这将是一个可扩展性问题。现在,对于第二个建议,它似乎很有希望,我会在有时间进一步试验时报告!
  • 我的意思是只有一个精灵(或一些小数字),加上一个通过引用 u_time 为其设置动画的自定义着色器。我们为正在开发的游戏提供了类似的东西,其中一艘船以一种扭曲和收缩的效果跳到超空间,然后以一种使用基本相同的着色器但有效地使用 u_time 的逆向效果弹出它反向运行。你会有一个精灵,它的纹理有一堆“粒子”,着色器基本上会代替发射器节点。

标签: swift sprite-kit skemitternode


【解决方案1】:

这很丑,但你可以做这样的事情:

let time = 5
let action = SKAction.customAction(withDuration:time){
                 node,elapsedTime in 
                 guard let emitter = node as SKEmitterNode else {return}
                 emitter.resetSimulation()
                 emitter.advanceSimulationTime(time - elapsedTime)

             }

【讨论】:

  • 重置和推进模拟是一个绝妙的主意!但是,我认为这不是一个可能的解决方案,因为粒子是随机生成的,因此不一定会在相同的模拟时间匹配。
  • 它不应该是随机的,它是围绕关键帧构建的,唯一的随机应该发生在您初始化或更改涉及多个粒子的设置之一时
  • 这是有道理的,但我在写第一个评论之前做了一些实验,这些都是遇到的结果。我设置了一个简单的火焰粒子,并根据用户输入重置模拟并将其推进到一个恒定的时间值。如果我犯了任何错误,请告诉我。
  • 分享你的例子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
相关资源
最近更新 更多