Qt Quick Exemples de particules - Système

Il s'agit d'une collection d'exemples utilisant les Affectors dans le système de particules QML.

Il s'agit d'une collection de petits exemples QML relatifs à l'utilisation des Affectors dans le système de particules. Chaque exemple est un petit fichier QML mettant l'accent sur un type ou une caractéristique particulière.

La comparaison dynamique compare l'utilisation du système de particules à l'obtention d'un effet similaire avec le code suivant qui instancie dynamiquement les types d'images.

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(); }
            }
        }
    }
}

Notez que les objets Image ne peuvent pas être colorés de manière aléatoire.

Start et Stop définissent simplement les états de marche et de pause d'un site ParticleSystem. Bien que le système n'effectue aucune simulation lorsqu'il est arrêté ou en pause, un redémarrage relance la simulation depuis le début, tandis que l'annulation de la pause reprend la simulation là où elle se trouvait.

Les changements de groupe temporisés sont un exemple qui met en évidence le type ParticleGroup. Bien qu'il suffise normalement de désigner les groupes par une chaîne de caractères, des effets supplémentaires peuvent être obtenus en définissant des propriétés sur les groupes. Le premier groupe a une durée variable, mais il passe toujours au deuxième groupe.

ParticleGroup {
    name: "fire"
    duration: 2000
    durationVariation: 2000
    to: {"splode":1}
}

Le deuxième groupe a une TrailEmitter et une durée fixe pour l'émission dans le troisième groupe. En plaçant le TrailEmitter comme enfant direct du ParticleGroup, il sélectionne automatiquement ce groupe à suivre.

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}
    }
}

Le troisième groupe a un affectateur comme enfant direct, ce qui fait que l'affectateur cible automatiquement ce groupe. L'affector signifie que dès que des particules entrent dans ce groupe, une fonction burst peut être appelée sur un autre émetteur, en utilisant les positions x,y de cette particule.

ParticleGroup {
    name: "dead"
    duration: 1000
    Affector {
        once: true
        onAffected: (x, y)=> worksEmitter.burst(400,x,y)
    }
}

Si TrailEmitter ne répond pas à vos besoins en matière d'émetteurs multiples, vous pouvez également créer des émetteurs de manière dynamique tout en utilisant la même ParticleSystem et la même particule d'image.

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()
}

Notez que cet effet, une rafale de lances arc-en-ciel volantes, serait mieux servi avec TrailEmitter. Il n'est fait qu'avec des émetteurs dynamiques dans cet exemple pour montrer le concept plus simplement.

L'option Peintres multiples montre comment contrôler l'ordre de peinture des particules individuelles. Bien que l'ordre de peinture des particules au sein d'un ImagePainter ne soit pas strictement défini, les objets ImageParticle suivent les règles normales d'ordre Z pour les Qt Quick éléments. Cet exemple vous permet de peindre l'intérieur des particules au-dessus des bordures noires à l'aide d'une paire d'ImageParticles, chacune peignant des parties différentes de la même particule logique.

Exemple de projet @ code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.