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 绘制相同逻辑粒子的不同部分,以在粒子的内部绘制,并使用黑色边界上方的绘制。

示例项目 @ code.qt.io

版权所有© 2024 The Qt Company Ltd。本文件中包含的文档贡献均为相应所有者的版权。所提供的文档在免费软件基金会的发布下,遵循GNU自由文档许可协议第1.3版。Qt及其相关标志为芬兰及全球其他国家的The Qt Company Ltd.的商标。商标的所有其他商标均属于其相应所有者。