Qt Quick Particles Beispiele – System

Dies ist eine Sammlung von Beispielen zur Verwendung von Affektoren im QML-Partikelsystem.

Kreisförmige Partikel mit schwarzen Rändern auf blauem Hintergrund, die mehrere Maler darstellen

Dies ist eine Sammlung kleiner QML-Beispiele zur Verwendung von Affektoren im Partikelsystem. Jedes Beispiel ist eine kleine QML-Datei, die einen bestimmten Typ oder eine bestimmte Funktion hervorhebt.

Der dynamische Vergleich stellt die Verwendung des Partikelsystems einem ähnlichen Effekt gegenüber, der mit dem folgenden Code erzielt wird, der Image-Typen dynamisch instanziiert.

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

Beachten Sie, dass die „Image“-Objekte nicht zufällig eingefärbt werden können.

„Start“ und „Stop“ legen lediglich den Ausführungs- und den Pausenstatus eines „ ParticleSystem “ fest. Während das System im gestoppten oder pausierten Zustand keine Simulation durchführt, wird die Simulation bei einem Neustart von vorne begonnen, während die Fortsetzung der Simulation an der Stelle erfolgt, an der sie unterbrochen wurde.

„Timed group changes“ ist ein Beispiel, das den Typ „ ParticleGroup “ veranschaulicht. Während es normalerweise ausreicht, Gruppen über einen String-Namen zu referenzieren, lassen sich durch das Setzen von Eigenschaften an Gruppen zusätzliche Effekte erzielen. Die erste Gruppe hat eine variable Dauer, wechselt jedoch immer zur zweiten Gruppe.

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

Die zweite Gruppe verfügt über einen „ TrailEmitter “ sowie eine feste Dauer für die Emission in die dritte Gruppe. Indem der „ TrailEmitter “ als direktes untergeordnetes Element des „ ParticleGroup “ platziert wird, wählt er automatisch diese Gruppe als zu verfolgende Gruppe aus.

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

Die dritte Gruppe hat einen „Affector“ als direktes untergeordnetes Element, wodurch der Affector automatisch auf diese Gruppe ausgerichtet wird. Der Affector bewirkt, dass, sobald Partikel in diese Gruppe eintreten, eine „Burst“-Funktion für einen anderen Emitter aufgerufen werden kann, wobei die x- und y-Koordinaten dieses Partikels verwendet werden.

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

Falls „ TrailEmitter “ für mehrere Emitter nicht Ihren Anforderungen entspricht, können Sie Emitter auch dynamisch erstellen und dabei weiterhin denselben „ ParticleSystem “ und dasselbe Bildpartikel verwenden

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

Beachten Sie, dass dieser Effekt – ein Schwarm fliegender Regenbogenspeere – besser mit „ TrailEmitter “ umgesetzt werden sollte. In diesem Beispiel wird er nur mit dynamischen Emittern realisiert, um das Konzept einfacher zu veranschaulichen.

„Multiple Painters“ zeigt, wie man die Malreihenfolge einzelner Partikel steuert. Während die Malreihenfolge von Partikeln innerhalb eines „ImagePainter“ nicht streng definiert ist, folgen „ ImageParticle “-Objekte den normalen Z-Reihenfolge-Regeln für Qt Quick Elemente. In diesem Beispiel können Sie das Innere der Partikel über die schwarzen Ränder hinaus malen, indem Sie ein Paar „ImageParticles“ verwenden, von denen jedes unterschiedliche Teile desselben logischen Partikels malt.

Beispielprojekt @ 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.