2023-06-24 12:29:08 +08:00
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
|
|
import QtQuick
|
|
|
|
import Fk
|
|
|
|
|
|
|
|
Item {
|
|
|
|
id: root
|
|
|
|
anchors.fill: parent
|
|
|
|
property point start: Qt.point(0, 0)
|
|
|
|
property point end: Qt.point(0, 0)
|
|
|
|
property alias running: pointToAnimation.running
|
|
|
|
|
|
|
|
signal finished()
|
|
|
|
|
|
|
|
Repeater {
|
|
|
|
id: eggs
|
|
|
|
model: 7
|
|
|
|
|
|
|
|
Item {
|
|
|
|
property real xOffset
|
|
|
|
property real yOffset
|
|
|
|
|
|
|
|
Image {
|
|
|
|
id: egg
|
|
|
|
source: SkinBank.PIXANIM_DIR + "/wine/egg"
|
|
|
|
x: start.x - width / 2 + xOffset
|
|
|
|
y: start.y - height / 2 + yOffset
|
|
|
|
scale: 0.7
|
|
|
|
opacity: 0
|
2024-01-25 03:23:29 +08:00
|
|
|
rotation: (Math.atan(Math.abs(end.y - start.y)
|
|
|
|
/ Math.abs(end.x - start.x))
|
2023-06-24 12:29:08 +08:00
|
|
|
/ Math.PI * 180 - 90) * (end.x > start.x ? -1 : 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
Image {
|
|
|
|
id: whip
|
|
|
|
x: end.x - width / 2 + xOffset
|
|
|
|
y: end.y - height / 2 + yOffset
|
|
|
|
property int idx: 0
|
|
|
|
opacity: 0
|
|
|
|
scale: 1.7
|
|
|
|
source: SkinBank.PIXANIM_DIR + "/wine/egg" + idx
|
|
|
|
}
|
|
|
|
|
|
|
|
SequentialAnimation {
|
|
|
|
id: flyAnim
|
|
|
|
ScriptAction {
|
|
|
|
script: {
|
|
|
|
egg.opacity = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ParallelAnimation {
|
|
|
|
PropertyAnimation {
|
|
|
|
target: egg
|
|
|
|
property: "x"
|
|
|
|
to: end.x - egg.width / 2 + xOffset
|
|
|
|
duration: 250
|
|
|
|
}
|
|
|
|
PropertyAnimation {
|
|
|
|
target: egg
|
|
|
|
property: "y"
|
|
|
|
to: end.y - egg.height / 2 + yOffset
|
|
|
|
duration: 250
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ScriptAction {
|
|
|
|
script: {
|
|
|
|
egg.opacity = 0;
|
|
|
|
whip.opacity = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
PropertyAnimation {
|
|
|
|
target: whip
|
|
|
|
property: "idx"
|
|
|
|
to: 18
|
|
|
|
duration: 370
|
|
|
|
}
|
|
|
|
ScriptAction {
|
|
|
|
script: {
|
|
|
|
whip.opacity = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function startAnim() { flyAnim.start(); }
|
|
|
|
|
|
|
|
Component.onCompleted: {
|
|
|
|
xOffset = Math.random() * 70 - 35;
|
|
|
|
yOffset = Math.random() * 70 - 30;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Image {
|
|
|
|
id: shoeS
|
|
|
|
source: SkinBank.PIXANIM_DIR + "/wine/shoe_s"
|
|
|
|
x: start.x - width / 2
|
|
|
|
y: start.y - height / 2
|
|
|
|
scale: 0
|
|
|
|
}
|
|
|
|
|
|
|
|
Image {
|
|
|
|
id: shoe
|
|
|
|
source: SkinBank.PIXANIM_DIR + "/wine/shoe"
|
|
|
|
x: start.x - width / 2
|
|
|
|
y: start.y - height / 2
|
|
|
|
scale: 0
|
|
|
|
}
|
|
|
|
|
|
|
|
Image {
|
|
|
|
id: hit
|
|
|
|
x: end.x - width / 2
|
|
|
|
y: end.y - height / 2
|
|
|
|
property int idx: 1
|
|
|
|
opacity: 0
|
|
|
|
scale: 1.2
|
|
|
|
source: SkinBank.PIXANIM_DIR + "/shoe/hit" + idx
|
|
|
|
}
|
|
|
|
|
|
|
|
property int seqIdx: 0
|
|
|
|
|
|
|
|
SequentialAnimation {
|
|
|
|
id: pointToAnimation
|
|
|
|
running: false
|
|
|
|
|
|
|
|
ScriptAction {
|
|
|
|
script: Backend.playSound("./audio/system/wine1");
|
|
|
|
}
|
|
|
|
|
|
|
|
SequentialAnimation {
|
|
|
|
loops: 7
|
|
|
|
ScriptAction {
|
|
|
|
script: {
|
|
|
|
const e = eggs.itemAt(seqIdx);
|
|
|
|
e.startAnim();
|
|
|
|
seqIdx++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
PauseAnimation { duration: 320 }
|
|
|
|
}
|
|
|
|
|
|
|
|
PauseAnimation { duration: 200 }
|
|
|
|
|
|
|
|
ScriptAction {
|
|
|
|
script: Backend.playSound("./audio/system/wine2");
|
|
|
|
}
|
|
|
|
|
|
|
|
ParallelAnimation {
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoe
|
|
|
|
property: "scale"
|
|
|
|
to: 1
|
|
|
|
duration: 660
|
|
|
|
}
|
|
|
|
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoe
|
|
|
|
property: "x"
|
|
|
|
to: end.x - shoe.width / 2
|
|
|
|
duration: 660
|
|
|
|
}
|
|
|
|
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoe
|
|
|
|
property: "y"
|
|
|
|
to: end.y - shoe.height / 2
|
|
|
|
duration: 660
|
|
|
|
}
|
|
|
|
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoe
|
|
|
|
property: "rotation"
|
|
|
|
to: 360
|
|
|
|
duration: 330
|
|
|
|
loops: 2
|
|
|
|
}
|
|
|
|
|
|
|
|
SequentialAnimation {
|
|
|
|
PauseAnimation { duration: 80 }
|
|
|
|
ParallelAnimation {
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoeS
|
|
|
|
property: "scale"
|
|
|
|
to: 1
|
|
|
|
duration: 660
|
|
|
|
}
|
|
|
|
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoeS
|
|
|
|
property: "x"
|
|
|
|
to: end.x - shoeS.width / 2
|
|
|
|
duration: 660
|
|
|
|
}
|
|
|
|
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoeS
|
|
|
|
property: "y"
|
|
|
|
to: end.y - shoeS.height / 2
|
|
|
|
duration: 660
|
|
|
|
}
|
|
|
|
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoeS
|
|
|
|
property: "rotation"
|
|
|
|
to: 360
|
|
|
|
duration: 330
|
|
|
|
loops: 2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SequentialAnimation {
|
|
|
|
PauseAnimation { duration: 660 }
|
|
|
|
ScriptAction {
|
|
|
|
script: {
|
|
|
|
hit.opacity = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
PropertyAnimation {
|
|
|
|
target: hit
|
|
|
|
property: "idx"
|
|
|
|
to: 10
|
|
|
|
duration: 300
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ParallelAnimation {
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoe
|
|
|
|
property: "opacity"
|
|
|
|
to: 0
|
|
|
|
duration: 100
|
|
|
|
}
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoe
|
|
|
|
property: "y"
|
|
|
|
to: end.y - shoe.height / 2 + 20
|
|
|
|
duration: 100
|
|
|
|
}
|
|
|
|
PropertyAnimation {
|
|
|
|
target: shoeS
|
|
|
|
property: "opacity"
|
|
|
|
to: 0
|
|
|
|
duration: 100
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onStopped: {
|
|
|
|
root.visible = false;
|
|
|
|
root.finished();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|