From c2aab690b654e1a3b3a95e85b45ce00fb30b6a31 Mon Sep 17 00:00:00 2001 From: Alexey Andreyev Date: Mon, 8 Feb 2021 18:39:25 +0300 Subject: [PATCH] Fancy effects: introduce Fireworks --- .../Component/FancyEffectsContainer.qml | 138 +++++++++++++++++- 1 file changed, 136 insertions(+), 2 deletions(-) diff --git a/imports/NeoChat/Component/FancyEffectsContainer.qml b/imports/NeoChat/Component/FancyEffectsContainer.qml index e541ca6bf..a51590e21 100644 --- a/imports/NeoChat/Component/FancyEffectsContainer.qml +++ b/imports/NeoChat/Component/FancyEffectsContainer.qml @@ -23,10 +23,12 @@ Item { snowTimer.start() } - function showFireworkEffect() { - + function showFireworksEffect() { + fireworksTimer.start() } + // Confetti + Timer { id: confettiTimer interval: item.effectInterval; @@ -86,6 +88,8 @@ Item { } } + // Snow + Timer { id: snowTimer interval: item.effectInterval; @@ -148,4 +152,134 @@ Item { } } } + + // Fireworks + + Timer { + id: fireworksTimer + interval: item.effectInterval; + running: false; + repeat: false; + triggeredOnStart: true; + onTriggered: { + if (item.enabled) { + fireworksInternalTimer.running = !fireworksInternalTimer.running + } + } + } + + Timer { + id: fireworksInternalTimer + interval: 300 + triggeredOnStart: true + running: false + repeat: true + onTriggered: { + customEmit(Math.random() * parent.width, + Math.random() * parent.width) // height is 0 somehow + } + } + + ParticleSystem { + id: fireworksSystem + running: fireworksInternalTimer.running + onRunningChanged: { + if (running) { + opacity = 1 + } else { + opacity = 0 + } + } + + Behavior on opacity { + SequentialAnimation { + NumberAnimation { duration: Kirigami.Units.longDuration } + } + } + } + + ImageParticle { + id: fireworksParticleA + system: fireworksSystem + source: "qrc:///particleresources/glowdot.png" + alphaVariation: 0.1 + alpha: 0.1 + groups: ["a"] + opacity: fireworksSystem.opacity + } + + ImageParticle { + system: fireworksSystem + source: "qrc:///particleresources/glowdot.png" + color: "white" + alphaVariation: 0.1 + alpha: 0.1 + groups: ["white"] + opacity: fireworksSystem.opacity + } + + ImageParticle { + id: fireworksParticleB + system: fireworksSystem + source: "qrc:///particleresources/glowdot.png" + alphaVariation: 0.1 + alpha: 0.1 + groups: ["b"] + opacity: fireworksSystem.opacity + } + + Component { + id: emitterComp + Emitter { + id: container + property int life: 2600 + property real targetX: 0 + property real targetY: 0 + width: 1 + height: 1 + system: fireworksSystem + emitRate: 100 + size: 16 + endSize: 8 + sizeVariation: 5 + Timer { + interval: life + running: true + onTriggered: { + container.destroy(); + var randomHue = Math.random() + fireworksParticleA.color = Qt.hsla(randomHue, 0.8, 0.5, 1) + fireworksParticleA.color = Qt.hsla(1-randomHue, 0.8, 0.5, 1) + } + } + velocity: AngleDirection {angleVariation:360; magnitude: 200} + } + } + + function customEmit(x,y) { + var currentSize = Math.round(Math.random() * 200) + 40 + var currentLifeSpan = Math.round(Math.random() * 1000) + 100 + for (var i=0; i<8; i++) { + var obj = emitterComp.createObject(root); + obj.x = x + obj.y = y + obj.targetX = Math.random() * currentSize - currentSize/2 + obj.x + obj.targetY = Math.random() * currentSize - currentSize/2 + obj.y + obj.life = Math.round(Math.random() * 2400) + 200 + obj.emitRate = Math.round(Math.random() * 32) + 32 + obj.lifeSpan = currentLifeSpan + const group = Math.round(Math.random() * 3); + switch (group) { + case 0: + obj.group = "white"; + break; + case 1: + obj.group = "a"; + break; + case 2: + obj.group = "b"; + break; + } + } + } }