QML粒子系统-Affector(3)

920 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 16 天,点击查看活动详情


📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!


Affector影响器的子类型

前言

书接上文,本节对余下四个Affector影响器的子类型进行介绍和举例使用。

  • Age
  • Attractor
  • Friction
  • Gravity
  • GroupGoal
  • SpriteGoal
  • Turbulence
  • Wander

GroupGoal

用来改变一组粒子的状态。使用此元素可以让一个组中的粒子立即过渡到另一个组中。

属性列表

属性类型描述
goalStatestring受影响粒子应该移动到的组的名称。
组之间可以定义持续时间和转换,设置目标状态将导致它忽略任何路径权重(包括0),并朝着最快到达目标状态的路径前进。它将通过这条路径上的中间组,为它们各自的持续时间。
jumpbool如果为true,受影响的粒子将直接跳转到目标组,而不是采取最短的有效路径到达那里。他们也不会结束当前的状态,而是立即移动到目标状态的起始处。默认是false。

代码示例

本实例中定义了三个粒子组,在name为“unlit”的粒子组中使用到了GroupGoal影响器。在此处将goalState属性设置为了lighting粒子组的name属性值,同时将jump设置为true,这表示受GroupGoal影响器作用的粒子组将立即进入lighting粒子组中,按照lighting粒子组的行为进行运动。

        ParticleGroup {
            name: "unlit"; duration: 1000
            to: {"lighting":1, "unlit":10}
			...
			...
			...
            GroupGoal {
                whenCollidingWith: ["lit"]
                goalState: "lighting"
                jump: true
            }
        }

        ParticleGroup {
            name: "lighting"; duration: 200; to: {"lit":1}
        }

        ParticleGroup {
            name: "lit"; duration: 2000
            TrailEmitter {
                group: "flame"; emitRatePerParticle: 50
                lifeSpan: 200; emitWidth: 8; emitHeight: 8
                size: 24; sizeVariation: 8; endSize: 4
            }
        }

效果展示

GroupGoal1.gif 本实例中会持续发射暗黄粒子,当它们的lifeSpan值为0,也就是即将消失时,会转到燃烧状态。而使用GroupGoal影响器后,一些受到影响的粒子则会直接转到燃烧状态。

SpriteGoal

用于改变精灵粒子的状态。SpriteGoal与上面的GroupGoal类型非常相似,不同的是SpriteGoal影响器指向Sprite精灵图。

属性列表

属性类型描述
goalStatestring受影响的粒子应该移动到的精灵的名称。
精灵状态已经定义了它们之间的持续时间和转换,设置目标状态将导致它忽略任何路径权重(包括0),并朝着最快到达目标状态的路径前进。它会在这条路径上经过中间状态。
jumpbool如果为true,受影响的精灵将直接跳转到目标状态,而不是通过最短有效路径到达那里。他们也不会结束当前的状态,而是立即移动到目标状态的初始处。默认是false。
systemStatesbool已弃用,请使用GroupGoal

第三个属性systemStates已经弃用

代码示例

本实例的ImageParticle图片渲染器中使用了精灵图以供SpriteGoal影响器跳转。刚开始时的ImageParticle图片渲染器选用的是name值为"spinning"的sprites组,在触发SpriteGoal影响器后会被跳转到name值为"explode"的sprites组。

    ImageParticle {
        system: sys
        groups: ["meteor"]
        sprites:[Sprite {
                id: spinState
                name: "spinning"
                source: "../../images/meteor.png"
                frameCount: 35
                frameDuration: 40
                randomStart: true
                to: {"explode":0, "spinning":1}
            },Sprite {
                name: "explode"
                source: "../../images/_explo.png"
                frameCount: 22
                frameDuration: 40
                to: {"nullFrame":1}
            },Sprite {//Not sure if this is needed, but seemed easiest
                name: "nullFrame"
                source: "../../images/nullRock.png"
                frameCount: 1
                frameDuration: 1000
            }
        ]
    }
    //! [0]
    SpriteGoal {
        groups: ["meteor"]
        system: sys
        goalState: "explode"
        jump: true
        anchors.fill: rocketShip
        width: 60
        height: 60
    }

效果展示

SpriteGoal.gif 上述定义的name值为"spinning"的sprites组就是图中的大陨石,触发影响器后则跳转到name值为"explode"的sprites组,也就是大陨石碰到火箭后变成了小陨石,好像被撞碎了一样。

Turbulence

从噪声图像中提供类似流体的力量。湍流元素将噪声源在其影响的区域上缩放,并使用该噪声源的旋度来生成力矢量。湍流需要一个固定的大小。与其他影响器不同,0x0湍流元素不会影响粒子。

Turbulence类型一般用于产生一个不稳定状态,例如跳动的火焰。

属性列表

属性类型描述
noiseSourceurl产生湍流的源图像。它将被缩放到元素的大小,因此相等或更大的大小将提供更好的结果。调整这幅图像是调整诸如漩涡在哪里或存在多少这样的行为的唯一方法。
源图像应是比较平滑的黑白杂波,如柏林杂波。如果没有提供映像,则将使用默认映像。
strengthreal速度矢量在任意点的大小在0和2的平方根之间变化。然后再乘以强度,得到受湍流影响的粒子每秒的速度。

代码示例

此处没有设置noiseSource属性,将会使用默认值。同时将strength值设置为1000,表示对粒子附加随机强度的方向和速度。

        Turbulence {
            anchors.fill: parent; system: particles
            strength: 1000
        }

效果展示

Turbulence.gif 从图中可以看到粒子在经过Turbulence影响器后被随机发射了出去。

Wander

用于应用随机粒子轨迹。Wander元素可以改变粒子的运动轨迹。

属性列表

属性类型描述
affectedParameterAffectableParameter粒子的哪些属性直接受到影响。
PointAttractor.Position
PointAttractor.Velocity
PointAttractor.Acceleration
pacereal每秒最大属性变化量。
xVariancerealx属性的最大值。如果未设置,Wander将不会影响x的值。
yVariancerealy属性的最大值。如果未设置,Wander将不会影响y的值。

代码示例

此处代码将xVariance的值设置为300,随机改变了粒子的x值,会使粒子的x值最大增加300。pace设置为1000表示每秒属性变化值最大为1000。也就是最多不到三分之一秒就会将粒子的x值改变300.

        Wander {
            anchors.fill: parent; system: particles
            xVariance: 300;
            pace: 1000
            affectedParameter: Wander.Position
        }

效果展示

Wander.gif 从图中看出经过矩形框的粒子会左右横移,这是因为上面的代码中设置了Wander影响器随机改变粒子x的值,使得粒子的x坐标呈现不稳定的状态。