Qt Quick Particles Exemples - Émetteurs

Voici une série d'exemples d'utilisation des émetteurs dans le système de particules QML.

Des particules courbes formant un motif en forme de fleur avec six rayons tournants

Il s'agit d'une série de petits exemples QML relatifs à l'utilisation des émetteurs dans le système de particules. Chaque exemple est un petit fichier QML mettant en avant un type ou une fonctionnalité particulière.

La vitesse issue du mouvement crée un effet de mouvement intense des particules, principalement en déplaçant les émetteurs :

Emitter {
    id: trailsNormal
    system: sys1

    emitRate: 500
    lifeSpan: 2000

    y: mouseArea.pressed ? mouseArea.mouseY : circle.cy
    x: mouseArea.pressed ? mouseArea.mouseX : circle.cx

    velocity: PointDirection {xVariation: 4; yVariation: 4;}
    acceleration: PointDirection {xVariation: 10; yVariation: 10;}
    velocityFromMovement: 8

    size: 8
    sizeVariation: 4
}

« Burst » et « pulse » appellent les méthodes « burst » et « pulse » sur deux émetteurs identiques.

    if (root.lastWasPulse) {
        burstEmitter.burst(500);
        root.lastWasPulse = false;
    } else {
        pulseEmitter.pulse(500);
        root.lastWasPulse = true;
    }

Notez que « burst » prend en argument le nombre de particules à émettre, tandis que « pulse » prend en argument la durée d'émission en millisecondes. Cela donne un comportement légèrement différent, facile à observer dans cet exemple.

« Custom Emitter » se connecte au signal « emitParticles » pour définir des valeurs arbitraires sur les données des particules au moment de leur émission ;

onEmitParticles: (particles) => {
    for (var i=0; i<particles.length; i++) {
        let particle = particles[i];
        particle.startSize = Math.max(02,Math.min(492,Math.tan(particle.t/2)*24));
        let theta = Math.floor(Math.random() * 6.0);
        particle.red = theta == 0 || theta == 1 || theta == 2 ? 0.2 : 1;
        particle.green = theta == 2 || theta == 3 || theta == 4 ? 0.2 : 1;
        particle.blue = theta == 4 || theta == 5 || theta == 0 ? 0.2 : 1;
        theta /= 6.0;
        theta *= 2.0*Math.PI;
        theta += sys.convert(sys.petalRotation);//Convert from degrees to radians
        particle.initialVX = sys.petalLength * Math.cos(theta);
        particle.initialVY = sys.petalLength * Math.sin(theta);
        particle.initialAX = particle.initialVX * -0.5;
        particle.initialAY = particle.initialVY * -0.5;
    }
}

Cette fonction est utilisée pour émettre des particules décrivant des courbes selon six rayons rotatifs.

« Emit mask » définit un masque d’image sur l’émetteur, afin d’émettre des particules selon une forme arbitraire.

shape: MaskShape {
    source: "images/starfish_mask.png"
}

« Maximum emitted » limite le nombre de particules émises à un certain nombre à la fois. Cet exemple permet de voir facilement ce qui se passe lorsque la limite est atteinte.

« Shape and Direction » émet des particules à partir d’une forme elliptique non remplie, en utilisant un TargetDirection

shape: EllipseShape {fill: false}
velocity: TargetDirection {
    targetX: root.width/2
    targetY: root.height/2
    proportionalMagnitude: true
    magnitude: 0.5
}

Cela envoie les particules vers le centre de l’ellipse à une vitesse proportionnelle, en conservant le contour de l’ellipse à mesure qu’elles se déplacent vers le centre.

TrailEmitter utilise ce type pour ajouter des particules de fumée qui suivent les particules de feu dans la scène.

onEmitParticles: (particles) => {
    for (var i=0; i<particles.length; i++) {
        let particle = particles[i];
        particle.startSize = Math.max(02,Math.min(492,Math.tan(particle.t/2)*24));
        let theta = Math.floor(Math.random() * 6.0);
        particle.red = theta == 0 || theta == 1 || theta == 2 ? 0.2 : 1;
        particle.green = theta == 2 || theta == 3 || theta == 4 ? 0.2 : 1;
        particle.blue = theta == 4 || theta == 5 || theta == 0 ? 0.2 : 1;
        theta /= 6.0;
        theta *= 2.0*Math.PI;
        theta += sys.convert(sys.petalRotation);//Convert from degrees to radians
        particle.initialVX = sys.petalLength * Math.cos(theta);
        particle.initialVY = sys.petalLength * Math.sin(theta);
        particle.initialAX = particle.initialVX * -0.5;
        particle.initialAY = particle.initialVY * -0.5;
    }
}

Exemple de projet sur 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.