Qt Quick 颗粒示例 - 系统
这是一系列使用 QML 颗粒系统 Affector 的示例。
这是一系列小型的 QML 示例,它们与在颗粒系统中使用 Affector 有关。每个示例都是一个小的 QML 文件,强调特定类型或功能。
动态比较是通过以下代码动态实例化 Image 类型来实现类似效果的方法与使用粒子系统比较。
Item { id: fakeEmitter function burst(number) { while (number > 0) { let item = fakeParticle.createObject(root) item.lifeSpan = Math.random() * 5000 + 5000 item.x = Math.random() * (root.width / 2) + (root.width / 2) item.y = 0 number-- } } Component { id: fakeParticle Image { id: container property int lifeSpan: 10000 width: 32 height: 32 source: "qrc:///particleresources/glowdot.png" PropertyAnimation on y { from: -16; to: root.height - 16; duration: container.lifeSpan; running: true } SequentialAnimation on opacity { running: true NumberAnimation { from: 0; to: 1; duration: 500 } PauseAnimation { duration: container.lifeSpan - 1000 } NumberAnimation { from: 1; to: 0; duration: 500 } ScriptAction { script: container.destroy(); } } } } }
注意 Image 对象不能被随机着色。
开始和停止简单设置 ParticleSystem 的运行和暂停状态。当系统停止或暂停时,系统不执行任何仿真,但重启将从开始处重启仿真,而取消暂停将继续从上次中断处恢复。
计时分组更改是一个强调 ParticleGroup 类型的示例。虽然通常使用字符串名引用组就足够了,但通过在组上设置属性可以执行额外的效果。第一个组具有可变时长,但始终过渡到第二个组。
ParticleGroup { name: "fire" duration: 2000 durationVariation: 2000 to: {"splode":1} }
第二个组上有一个 TrailEmitter,并有一个固定时长向第三个组发射。通过将 TrailEmitter 作为 ParticleGroup 的直接子项,它自动选择该组进行跟踪。
ParticleGroup { name: "splode" duration: 400 to: {"dead":1} TrailEmitter { group: "works" emitRatePerParticle: 100 lifeSpan: 1000 maximumEmitted: 1200 size: 8 velocity: AngleDirection {angle: 270; angleVariation: 45; magnitude: 20; magnitudeVariation: 20;} acceleration: PointDirection {y:100; yVariation: 20} } }
第三个组有一个直接子项 Affector,这使得 Affector 自动针对该组。Affector 的意思是当粒子进入该组时,可以调用另一个发射器的爆发函数,使用该粒子的 x,y 位置的坐标。
ParticleGroup { name: "dead" duration: 1000 Affector { once: true onAffected: (x, y)=> worksEmitter.burst(400,x,y) } }
如果 TrailEmitter 不适合您的多发射器需求,您还可以在仍然使用相同的 ParticleSystem 和图像粒子的情况下动态创建发射器
for (var i = 0; i < 8; i++) { let obj = emitterComp.createObject(root) obj.x = x obj.y = y obj.targetX = Math.random() * 240 - 120 + obj.x obj.targetY = Math.random() * 240 - 120 + obj.y obj.life = Math.round(Math.random() * 2400) + 200 obj.emitRate = Math.round(Math.random() * 32) + 32 obj.go() }
注意,这个效果,即飞舞的彩虹长矛,更适合用 TrailEmitter 来实现。在这个示例中仅使用动态发射器来实现此概念。
多个画家展示了如何控制单个粒子的绘制顺序。虽然一个 ImagePainter 中的粒子的绘制顺序并不严格定义,ImageParticle 对象遵循 Qt Quick 项的正常 Z-顺序规则。此示例允许您使用一对 ImageParticles 绘制相同逻辑粒子的不同部分,以在粒子的内部绘制,并使用黑色边界上方的绘制。
版权所有© 2024 The Qt Company Ltd。本文件中包含的文档贡献均为相应所有者的版权。所提供的文档在免费软件基金会的发布下,遵循GNU自由文档许可协议第1.3版。Qt及其相关标志为芬兰及全球其他国家的The Qt Company Ltd.的商标。商标的所有其他商标均属于其相应所有者。