粒子系统的核心是,用于控制共享时间线。一个场景可以有多个粒子系统,每一个都有自己独立的时间线。粒子由Emitter元素发射,使用ParticlePainter进行可视化显示,这个显示可以是图像、QML 项目或者阴影元素等。Emitter还使用向量空间定义了粒子的方向。粒子一旦发射,就完全脱离了发射器的管理。粒子模块则提供了Affector,允许控制发射出的粒子。系统中的粒子可以通过ParticleGroup共享时间变换,默认情况下,粒子都是属于空组(即”)。

    按照上面的简介,粒子系统包含以下重要的类:

    • Emitter – 向系统中发射逻辑粒子
    • ParticlePainter – 使用粒子画笔绘制粒子
    • Direction – 已经发射出的粒子使用的向量空间
    • ParticleGroup – 每一个粒子都隶属于一个组
    • Affector – 维护已经发射出的粒子
      下面我们从一个简单的示例开始。使用 Qt Quick 粒子系统非常简单,我们需要使用:

    • 为模拟系统构建所有元素的ParticleSystem

    • 向系统中发射粒子的Emitter
    • 继承自ParticlePainter的元素,用于实现粒子可视化的

    程序运行如下:

    粒子系统

    为了显示出发射器的范围,我们特意添加了一个绿色矩形,用于标记处发射器的边框。注意观察,大部分粒子都会出现在这个绿色矩形内,但是也会有少量粒子超出边界。粒子渲染的位置取决于其生命周期和粒子的方向。我们会在后面详细介绍有关粒子方向的概念。

    发射器仅仅发射逻辑上的粒子,每一个逻辑粒子都要通过ParticlePainter绘制出来,以便可视化显示。在这个例子中,我们使用了ItemParticle类型。ItemParticle可以设置一个代理,用于渲染每个粒子。注意,我们同样使用system属性,将ItemParticle与关联起来。

    下面着重说明几个参数:

    • emitRate:每秒钟射出的粒子数(默认是每秒 10 个)
    • sizeendSize:粒子的起始大小和终止大小(默认是 16px)
      修改这些参数,可以非常明显的影响到一个粒子系统的运行行为。例如,我们将上面的Emitter修改为:
    1. Emitter {
    2. id: emitter
    3. anchors.centerIn: parent
    4. width: 160; height: 80
    5. system: particles
    6. emitRate: 40
    7. lifeSpan: 2000
    8. lifeSpanVariation: 500
    9. anchors.fill: parent
    10. color: 'transparent'
    11. border.color: 'green'
    12. border.width: 2
    13. opacity: 0.8
    14. }
    15. }

    运行结果如下:注意观察由于增大了emitRate,同时延长了lifeSpanlifeSpanVariation,系统中同时存在的粒子比之前的版本增加了很多。

    除了ItemParticle,我们还可以使用ImageParticle。顾名思义,ImageParticle使用图像渲染粒子。我们可以设置其source属性指定图像,例如下面的代码片段:

    其中,star.png 图像放在下面,有兴趣的话可以右键另存为保存在本地运行代码。

    star.png

    如果所有粒子都使用同一个图像,这个粒子系统会显得很假。事实上,即便使用图像,粒子也可以设置其颜色,例如,下面我们将粒子的主体颜色设置为金色,但是允许一个 +/-60% 的误差范围:

    1. color: '#FFD700'
    2. colorVariation: 0.6

    为了让场景更生动,我们还可以旋转粒子:将每一个粒子顺时针旋转 15 度,另外有一个 +/-5 度的误差范围;然后,这些粒子继续以每秒 45 度的速度旋转。这个速度因粒子而异,会有一个 +/-15 度每秒的误差范围。

    我们还可以修改粒子进入场景的效果。当粒子的生命周期开始时,就会应用这个效果。在这个例子中,我们希望添加一个缩放效果:

      最后,我们的代码变成了这个样子:

      现在,我们有了一堆能够旋转的五颜六色的星星:

      粒子系统-旋转的星星