Qt Quick Demo - Same Game
/**************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtQuick.Particles 2.0 import "samegame.js" as Logic import "." Item { id: gameCanvas property bool gameOver: true property int score: 0 property int highScore: 0 property int moves: 0 property string mode: "" property ParticleSystem ps: particleSystem //For easy theming property alias backgroundVisible: bg.visible property string background: "gfx/background.png" property string blockFile: "Block.qml" property int blockSize: Settings.blockSize onBlockFileChanged: Logic.changeBlock(blockFile); property alias particlePack: auxLoader.source //For multiplayer property int score2: 0 property int curTurn: 1 property bool autoTurnChange: false signal swapPlayers property bool swapping: false //onSwapPlayers: if (autoTurnChange) Logic.turnChange();//Now implemented below //For puzzle property url level property bool puzzleWon: false signal puzzleLost //Since root is tracking the puzzle progress function showPuzzleEnd (won) { if (won) { smokeParticle.color = Qt.rgba(0,1,0,0); puzzleWin.play(); } else { smokeParticle.color = Qt.rgba(1,0,0,0); puzzleFail.play(); puzzleLost(); } } function showPuzzleGoal (str) { puzzleTextBubble.opacity = 1; puzzleTextLabel.text = str; } Image { id: bg z: -1 anchors.fill: parent source: background; fillMode: Image.PreserveAspectCrop } MouseArea { anchors.fill: parent; onClicked: { if (puzzleTextBubble.opacity == 1) { puzzleTextBubble.opacity = 0; Logic.finishLoadingMap(); } else if (!swapping) { Logic.handleClick(mouse.x,mouse.y); } } } Image { id: highScoreTextBubble opacity: mode == "arcade" && gameOver && gameCanvas.score == gameCanvas.highScore ? 1 : 0 Behavior on opacity { NumberAnimation {} } anchors.centerIn: parent z: 10 source: "gfx/bubble-highscore.png" Image { anchors.centerIn: parent source: "gfx/text-highscore-new.png" rotation: -10 } } Image { id: puzzleTextBubble anchors.centerIn: parent opacity: 0 Behavior on opacity { NumberAnimation {} } z: 10 source: "gfx/bubble-puzzle.png" Connections { target: gameCanvas onModeChanged: if (mode != "puzzle" && puzzleTextBubble.opacity > 0) puzzleTextBubble.opacity = 0; } Text { id: puzzleTextLabel width: parent.width - 24 anchors.centerIn: parent horizontalAlignment: Text.AlignHCenter color: "white" font.pixelSize: 24 font.bold: true wrapMode: Text.WordWrap } } onModeChanged: { p1WonImg.opacity = 0; p2WonImg.opacity = 0; } SmokeText { id: puzzleWin; source: "gfx/icon-ok.png"; system: particleSystem } SmokeText { id: puzzleFail; source: "gfx/icon-fail.png"; system: particleSystem } onSwapPlayers: { smokeParticle.color = "yellow" Logic.turnChange(); if (curTurn == 1) { p1Text.play(); } else { p2Text.play(); } clickDelay.running = true; } SequentialAnimation { id: clickDelay ScriptAction { script: gameCanvas.swapping = true; } PauseAnimation { duration: 750 } ScriptAction { script: gameCanvas.swapping = false; } } SmokeText { id: p1Text; source: "gfx/text-p1-go.png"; system: particleSystem; playerNum: 1 opacity: p1WonImg.opacity + p2WonImg.opacity > 0 ? 0 : 1 } SmokeText { id: p2Text; source: "gfx/text-p2-go.png"; system: particleSystem; playerNum: 2 opacity: p1WonImg.opacity + p2WonImg.opacity > 0 ? 0 : 1 } onGameOverChanged: { if (gameCanvas.mode == "multiplayer") { if (gameCanvas.score >= gameCanvas.score2) { p1WonImg.opacity = 1; } else { p2WonImg.opacity = 1; } } } Image { id: p1WonImg source: "gfx/text-p1-won.png" anchors.centerIn: parent opacity: 0 Behavior on opacity { NumberAnimation {} } z: 10 } Image { id: p2WonImg source: "gfx/text-p2-won.png" anchors.centerIn: parent opacity: 0 Behavior on opacity { NumberAnimation {} } z: 10 } ParticleSystem{ id: particleSystem; anchors.fill: parent z: 5 ImageParticle { id: smokeParticle groups: ["smoke"] source: "gfx/particle-smoke.png" alpha: 0.1 alphaVariation: 0.1 color: "yellow" } Loader { id: auxLoader anchors.fill: parent source: "PrimaryPack.qml" onItemChanged: { if (item && "particleSystem" in item) item.particleSystem = particleSystem if (item && "gameArea" in item) item.gameArea = gameCanvas } } } }