Warning, /education/gcompris/src/activities/penalty/Penalty.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - Penalty.qml 0002 * 0003 * SPDX-FileCopyrightText: 2014 Stephane Mankowski <stephane@mankowski.fr> 0004 * 0005 * Authors: 0006 * Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version) 0007 * Stephane Mankowski <stephane@mankowski.fr> (Qt Quick port) 0008 * 0009 * SPDX-License-Identifier: GPL-3.0-or-later 0010 */ 0011 import QtQuick 2.12 0012 import GCompris 1.0 0013 0014 import "../../core" 0015 import "penalty.js" as Activity 0016 0017 ActivityBase { 0018 id: activity 0019 0020 onStart: focus = true 0021 onStop: {} 0022 0023 pageComponent: Image { 0024 id: background 0025 source: Activity.url + "penalty_bg.svg" 0026 sourceSize.width: parent.width 0027 fillMode: Image.Stretch 0028 anchors.fill: parent 0029 signal start 0030 signal stop 0031 0032 Component.onCompleted: { 0033 activity.start.connect(start) 0034 activity.stop.connect(stop) 0035 } 0036 0037 // To enable tapping/clicking on left side of goal 0038 GoalZone { 0039 id: rectLeft 0040 state: "LEFT" 0041 progress: progressLeft 0042 anchors.right: player.left 0043 anchors.leftMargin: parent.width * 0.08 0044 anchors.bottomMargin: parent.height * 0.45 0045 } 0046 0047 // To enable tapping/clicking on top of goal 0048 GoalZone { 0049 id: rectTop 0050 state: "CENTER" 0051 progress: progressTop 0052 anchors.left: player.left 0053 anchors.right: player.right 0054 anchors.bottom: player.top 0055 } 0056 0057 // To enable tapping/clicking on right side of goal 0058 GoalZone { 0059 id: rectRight 0060 state: "RIGHT" 0061 progress: progressRight 0062 anchors.left: player.right 0063 anchors.rightMargin: parent.width * 0.06 0064 anchors.bottomMargin: parent.height * 0.45 0065 } 0066 0067 // Add here the QML items you need to access in javascript 0068 QtObject { 0069 id: items 0070 property Item main: activity.main 0071 property alias background: background 0072 property int currentLevel: activity.currentLevel 0073 property alias ball: ball 0074 property alias progressLeft: progressLeft 0075 property alias progressRight: progressRight 0076 property alias progressTop: progressTop 0077 property alias bonus: bonus 0078 property int duration: 0 0079 property int progressBarOpacity: 40 0080 property string saveBallState: "INITIAL" 0081 property double ballX: ball.parent.width/2 - ball.width/2 0082 property double ballY: ball.parent.height*0.77 - ball.height/2 0083 } 0084 0085 onStart: { Activity.start(items) } 0086 onStop: { 0087 timerBonus.stop() 0088 Activity.stop() 0089 } 0090 0091 /* Instruction */ 0092 Item { 0093 id: instruction 0094 z: 99 0095 anchors { 0096 top: parent.top 0097 topMargin: 10 0098 horizontalCenter: parent.horizontalCenter 0099 } 0100 width: parent.width * 0.9 0101 property alias text: instructionTxt.text 0102 visible: bar.level === 1 && text != "" 0103 0104 GCText { 0105 id: instructionTxt 0106 anchors { 0107 horizontalCenter: parent.horizontalCenter 0108 } 0109 fontSize: mediumSize 0110 color: "white" 0111 style: Text.Outline 0112 styleColor: "black" 0113 horizontalAlignment: Text.AlignHCenter 0114 width: parent.width 0115 wrapMode: TextEdit.WordWrap 0116 z: 2 0117 } 0118 0119 Rectangle { 0120 anchors.fill: instructionTxt 0121 z: 1 0122 opacity: 0.8 0123 radius: 10 0124 border.width: 2 0125 border.color: "black" 0126 gradient: Gradient { 0127 GradientStop { position: 0.0; color: "#000" } 0128 GradientStop { position: 0.9; color: "#666" } 0129 GradientStop { position: 1.0; color: "#AAA" } 0130 } 0131 } 0132 } 0133 0134 0135 /* The progress bars */ 0136 Progress { 0137 id: progressLeft 0138 anchors.left: parent.left 0139 anchors.leftMargin: parent.width / parent.implicitWidth * 62 0140 } 0141 0142 Progress { 0143 id: progressRight 0144 anchors.right: parent.right 0145 anchors.rightMargin: parent.width/parent.implicitWidth * 50 0146 } 0147 0148 Progress { 0149 id: progressTop 0150 anchors.topMargin: parent.width / parent.implicitWidth * 40 0151 anchors.horizontalCenter: parent.horizontalCenter 0152 width: parent.height / parent.implicitHeight * 20 0153 height: ratio / 100 * parent.width / parent.implicitWidth * 100 0154 } 0155 0156 /* The player */ 0157 Image { 0158 id: player 0159 source: Activity.url + "penalty_player.svg" 0160 fillMode: Image.PreserveAspectFit 0161 anchors.centerIn: parent 0162 sourceSize.width: 154 * ApplicationInfo.ratio 0163 } 0164 0165 /* The 2 click icon */ 0166 Image { 0167 source: Activity.url + "click_icon.svg" 0168 sourceSize.width: 90 * ApplicationInfo.ratio 0169 anchors.bottom: bar.top 0170 anchors.right: parent.right 0171 anchors.bottomMargin: 10 * ApplicationInfo.ratio 0172 anchors.rightMargin: 10 * ApplicationInfo.ratio 0173 } 0174 0175 /* The spot under the ball */ 0176 Rectangle { 0177 radius: 100 * ApplicationInfo.ratio 0178 color: "white" 0179 width: 50 * ApplicationInfo.ratio 0180 height: 33 * ApplicationInfo.ratio 0181 x: parent.width / 2 - width / 2 0182 y: parent.height * 0.77 + width - height / 2 0183 border.width: 1 0184 border.color: "#b4b4b4" 0185 } 0186 0187 /* The ball */ 0188 Image { 0189 id: ball 0190 source: Activity.url + "penalty_ball.svg" 0191 fillMode: Image.PreserveAspectFit 0192 sourceSize.width: 100 * ApplicationInfo.ratio 0193 0194 Behavior on x { PropertyAnimation {easing.type: Easing.OutQuad; duration: 1000} } 0195 Behavior on y { PropertyAnimation {easing.type: Easing.OutQuad; duration: 1000} } 0196 Behavior on sourceSize.width { PropertyAnimation {easing.type: Easing.OutQuad; duration: 1000} } 0197 0198 state: "INITIAL" 0199 states: [ 0200 State { 0201 name: "INITIAL" 0202 PropertyChanges { 0203 target: ball; 0204 sourceSize.width: 100 * ApplicationInfo.ratio 0205 x: parent.width/2 - width/2; 0206 y: parent.height*0.77 - height/2 0207 } 0208 PropertyChanges { 0209 target: instruction 0210 text: qsTr("Double click or double tap on the side of the goal you want to put the ball in.") 0211 } 0212 }, 0213 State { 0214 name: "RIGHT" 0215 PropertyChanges { 0216 target: ball 0217 sourceSize.width: 75 * ApplicationInfo.ratio 0218 x: background.width * 0.7 0219 y: background.height * 0.3 0220 } 0221 }, 0222 State { 0223 name: "LEFT" 0224 PropertyChanges { 0225 target: ball 0226 sourceSize.width: 75 * ApplicationInfo.ratio 0227 x: background.width * 0.2 0228 y: background.height * 0.3 0229 } 0230 }, 0231 State { 0232 name: "CENTER" 0233 PropertyChanges { 0234 target: ball; 0235 sourceSize.width: 75 * ApplicationInfo.ratio 0236 x: parent.width/2 - width/2; 0237 y: background.height * 0.1 0238 } 0239 }, 0240 State { 0241 name: "FAIL" 0242 PropertyChanges { 0243 target: ball 0244 sourceSize.width: 75 * ApplicationInfo.ratio 0245 x: parent.width/2 - width/2 0246 y: player.y + player.height / 2 0247 } 0248 PropertyChanges { 0249 target: instruction 0250 text: qsTr("Click or tap on the ball to bring it back to its initial position.") 0251 } 0252 } 0253 ] 0254 0255 MouseArea { 0256 anchors.fill: parent 0257 acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MidButton 0258 onClicked: { 0259 Activity.resetLevel() 0260 } 0261 } 0262 } 0263 0264 Timer { 0265 id: timerBonus 0266 interval: 1500 0267 onTriggered: { 0268 if (ball.state == "FAIL" || ball.state == "INITIAL") { 0269 bonus.bad("smiley") 0270 ball.state = "FAIL" 0271 } else { 0272 bonus.good("smiley") 0273 } 0274 } 0275 } 0276 0277 DialogHelp { 0278 id: dialogHelp 0279 onClose: home() 0280 } 0281 0282 Bar { 0283 id: bar 0284 level: items.currentLevel + 1 0285 content: BarEnumContent { value: help | home | level } 0286 onHelpClicked: { 0287 displayDialog(dialogHelp) 0288 } 0289 onPreviousLevelClicked: Activity.previousLevel() 0290 onNextLevelClicked: Activity.nextLevel() 0291 onHomeClicked: activity.home() 0292 } 0293 0294 Bonus { 0295 id: bonus 0296 winSound: "qrc:/gcompris/src/activities/ballcatch/resource/tuxok.wav" 0297 looseSound: "qrc:/gcompris/src/activities/ballcatch/resource/youcannot.wav" 0298 Component.onCompleted: { 0299 win.connect(Activity.nextLevel) 0300 } 0301 } 0302 } 0303 0304 }