Warning, /education/gcompris/src/activities/ballcatch/Ballcatch.qml is written in an unsupported language. File is not indexed.
0001 /* gcompris - Ballcatch.qml
0002
0003 SPDX-FileCopyrightText: 2014 Johnny Jazeix <jazeix@gmail.com>
0004
0005 Bruno Coudoin: initial Gtk+ version
0006
0007 SPDX-License-Identifier: GPL-3.0-or-later
0008 */
0009 import QtQuick 2.12
0010 import GCompris 1.0
0011
0012 import "../../core"
0013 import "../ballcatch"
0014 import "ballcatch.js" as Activity
0015
0016 ActivityBase {
0017 id: activity
0018
0019 onStart: {
0020 focus = true;
0021 }
0022 onStop: {}
0023
0024 Keys.onPressed: {
0025 Activity.processKey(event);
0026 }
0027
0028 pageComponent: Image {
0029 id: background
0030 signal start
0031 signal stop
0032 focus: true
0033 fillMode: Image.PreserveAspectCrop
0034 source: "qrc:/gcompris/src/activities/ballcatch/resource/beach1.svg"
0035 sourceSize.width: width
0036 sourceSize.height: height
0037
0038 property bool isVertical: background.width <= background.height // To check if in Vertical mode
0039
0040 // Needed to get keyboard focus on IntroMessage
0041 Keys.forwardTo: message
0042
0043 Component.onCompleted: {
0044 activity.start.connect(start);
0045 activity.stop.connect(stop);
0046 }
0047 QtObject {
0048 id: items
0049 property alias background: background
0050 property int currentLevel: activity.currentLevel
0051 property alias ball: ball
0052 property alias rightHand: rightHand
0053 property alias leftHand: leftHand
0054 property alias deltaPressedTimer: deltaPressedTimer
0055 /* when the corresponding arrow key is pressed, the following boolean pass
0056 to true and is reset at the end of the level */
0057 property bool leftPressed
0058 property bool rightPressed
0059 }
0060
0061 onStart: Activity.start(items);
0062
0063 onStop: Activity.stop();
0064
0065 onWidthChanged: {
0066 leftHand.reinitPosition();
0067 rightHand.reinitPosition();
0068 ball.reinitBall();
0069 }
0070
0071 onHeightChanged: {
0072 leftHand.reinitPosition();
0073 rightHand.reinitPosition();
0074 ball.reinitBall();
0075 }
0076
0077 DialogHelp {
0078 id: dialogHelpLeftRight
0079 onClose: home();
0080 }
0081
0082 Bar {
0083 id: bar
0084 level: items.currentLevel + 1
0085 content: BarEnumContent { value: help | home | level }
0086 onHelpClicked: displayDialog(dialogHelpLeftRight);
0087 onPreviousLevelClicked: if(!bonus.isPlaying) Activity.previousLevel();
0088 onNextLevelClicked: if(!bonus.isPlaying) Activity.nextLevel();
0089 onHomeClicked: home();
0090 }
0091
0092 Bonus {
0093 id: bonus
0094 winSound: "qrc:/gcompris/src/activities/ballcatch/resource/tuxok.wav"
0095 looseSound: "qrc:/gcompris/src/activities/ballcatch/resource/youcannot.wav"
0096 Component.onCompleted: {
0097 win.connect(Activity.nextLevel);
0098 loose.connect(Activity.restartLevel);
0099 }
0100 onStart: tux.opacity = 0;
0101 onStop: tux.opacity = 1;
0102 }
0103
0104 Image {
0105 id: tux
0106 x: background.width / 2 - width / 2
0107 y: leftHand.y - height / 3 - height / 2
0108 sourceSize.height: 200 * ApplicationInfo.ratio
0109 source: "qrc:/gcompris/src/activities/ballcatch/resource/tux.svg"
0110 Behavior on opacity { PropertyAnimation { easing.type: Easing.InQuad; duration: 250 } }
0111 }
0112
0113 Image {
0114 id: leftHand
0115 y: background.height - 1.5 * height
0116 z: 5
0117 sourceSize.height: 150 * ApplicationInfo.ratio
0118 source: "qrc:/gcompris/src/activities/ballcatch/resource/hand.svg"
0119
0120 NumberAnimation {
0121 id: leftHandAnimation
0122 target: leftHand; property: "x";
0123 to: background.width/2 - leftHand.width - 5;
0124 duration: 1000
0125 easing.type: Easing.InOutQuad
0126 }
0127
0128 function animate(newTime) {
0129 leftHandAnimation.duration = newTime;
0130 leftHandAnimation.start();
0131 }
0132
0133 function reinitPosition() {
0134 leftHandAnimation.stop();
0135 leftHand.x = background.width / 2 - width * 2;
0136 leftHand.y = background.height - 1.5 * height;
0137 }
0138
0139 MultiPointTouchArea {
0140
0141 id: mouseAreaLeftShift
0142 anchors.fill: parent
0143 onTouchUpdated: {
0144 // left
0145 if(!items.leftPressed && !Activity.gameFinished) {
0146 Activity.leftShiftPressed();
0147 items.leftPressed = true;
0148 }
0149 }
0150 }
0151 }
0152
0153 Image {
0154 id: rightHand
0155 mirror: true
0156 y: background.height - 1.5 * height
0157 z: 5
0158 sourceSize.height: 150 * ApplicationInfo.ratio
0159 source: "qrc:/gcompris/src/activities/ballcatch/resource/hand.svg"
0160
0161 function animate(newTime) {
0162 rightHandAnimation.duration = newTime;
0163 rightHandAnimation.start();
0164 }
0165
0166 function reinitPosition() {
0167 rightHandAnimation.stop();
0168 rightHand.x = background.width / 2 + width;
0169 rightHand.y = background.height - 1.5 * height;
0170 }
0171
0172 NumberAnimation {
0173 id: rightHandAnimation
0174 target: rightHand; property: "x";
0175 to: background.width / 2 + 5;
0176 duration: 1000;
0177 easing.type: Easing.InOutQuad
0178 }
0179
0180 MultiPointTouchArea {
0181 id: mouseAreaRightShift
0182 anchors.fill: parent
0183 onTouchUpdated: {
0184 // right
0185 if(!items.rightPressed && !Activity.gameFinished) {
0186 Activity.rightShiftPressed();
0187 items.rightPressed = true;
0188 }
0189 }
0190 }
0191 }
0192
0193 Image {
0194 id: leftShift
0195 z: 10
0196 x: background.width / 4 - width
0197 y: background.isVertical ? rightHand.y - height : rightHand.y - height / 2
0198 source: "qrc:/gcompris/src/activities/ballcatch/resource/arrow_key.svg"
0199 scale: background.isVertical ? 0.75 : 1.0
0200 smooth: true
0201 opacity: items.leftPressed ? 1 : 0.5
0202 visible: !ApplicationInfo.isMobile
0203 }
0204
0205 Image {
0206 id: rightShift
0207 z: 10
0208 mirror: true
0209 x: background.width - background.width / 4
0210 y: background.isVertical ? rightHand.y - height : rightHand.y - height / 2
0211 source: "qrc:/gcompris/src/activities/ballcatch/resource/arrow_key.svg"
0212 scale: background.isVertical ? 0.75 : 1.0
0213 smooth: true
0214 opacity: items.rightPressed ? 1 : 0.5
0215 visible: !ApplicationInfo.isMobile
0216 }
0217
0218 // Instructions
0219 IntroMessage {
0220 id: message
0221 intro: ApplicationInfo.isMobile ?
0222 [qsTr("Tap both hands at the same time, " +
0223 "to make the ball go in a straight line.")] :
0224 [qsTr("Press left and right arrow keys at the same time, " +
0225 "to make the ball go in a straight line.")]
0226 anchors {
0227 top: parent.top
0228 topMargin: 10
0229 }
0230 z: 10
0231 }
0232
0233 function playSound(identifier) {
0234 activity.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/"+ identifier + ".wav");
0235 }
0236
0237 /* Timer starting when user first presses a first key.
0238 If still running when the user presses the other key, he wins !
0239 */
0240 Timer {
0241 id: deltaPressedTimer
0242 running: false; repeat: false
0243 onTriggered: {
0244 Activity.endTimer();
0245 ball.startAnimation();
0246 }
0247 }
0248
0249 Ball {
0250 id: ball
0251 }
0252
0253 }
0254 }