| /**************************************************************************** |
| ** |
| ** 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 "logic.js" as Logic |
| import "towers" as Towers |
| |
| Item { |
| id: grid |
| |
| property int squareSize: 64 |
| property int rows: 6 |
| property int cols: 4 |
| property Item canvas: grid |
| property int score: 0 |
| property int coins: 100 |
| property int lives: 3 |
| property int waveNumber: 0 |
| property int waveProgress: 0 |
| property var towers |
| property var mobs |
| property bool gameRunning: false |
| property bool gameOver: false |
| property bool errored: false |
| property string errorString: "" |
| |
| width: cols * squareSize |
| height: rows * squareSize |
| |
| function freshState() { |
| lives = 3 |
| coins = 100 |
| score = 0 |
| waveNumber = 0 |
| waveProgress = 0 |
| gameOver = false |
| gameRunning = false |
| towerMenu.shown = false |
| helpButton.comeBack(); |
| } |
| |
| Text { |
| id: errorText // Mostly for debug purposes |
| text: errorString |
| visible: errored |
| color: "red" |
| font.pixelSize: 18 |
| wrapMode: Text.WordWrap |
| width: parent.width / 1.2 |
| height: parent.height / 1.2 |
| anchors.centerIn: parent |
| z: 1000 |
| } |
| |
| Timer { |
| interval: 16 |
| running: true |
| repeat: true |
| onTriggered: Logic.tick() |
| } |
| |
| MouseArea { |
| id: ma |
| anchors.fill: parent |
| onClicked: { |
| if (towerMenu.visible) |
| towerMenu.finish() |
| else |
| towerMenu.open(mouse.x, mouse.y) |
| } |
| } |
| |
| Image { |
| id: towerMenu |
| visible: false |
| z: 1500 |
| scale: 0.9 |
| opacity: 0.7 |
| property int dragDistance: 16 |
| property int targetRow: 0 |
| property int targetCol: 0 |
| property bool shown: false |
| property bool towerExists: false |
| |
| function finish() { |
| shown = false |
| } |
| |
| function open(xp,yp) { |
| if (!grid.gameRunning) |
| return |
| targetRow = Logic.row(yp) |
| targetCol = Logic.col(xp) |
| if (targetRow == 0) |
| towerMenu.y = (targetRow + 1) * grid.squareSize |
| else |
| towerMenu.y = (targetRow - 1) * grid.squareSize |
| towerExists = (grid.towers[Logic.towerIdx(targetCol, targetRow)] != null) |
| shown = true |
| helpButton.goAway(); |
| } |
| |
| states: State { |
| name: "shown"; when: towerMenu.shown && !grid.gameOver |
| PropertyChanges { target: towerMenu; visible: true; scale: 1; opacity: 1 } |
| } |
| |
| transitions: Transition { |
| PropertyAction { property: "visible" } |
| NumberAnimation { properties: "opacity,scale"; duration: 500; easing.type: Easing.OutElastic } |
| } |
| |
| x: -32 |
| source: "gfx/dialog.png" |
| Row { |
| id: buttonRow |
| height: 100 |
| anchors.centerIn: parent |
| spacing: 8 |
| BuildButton { |
| row: towerMenu.targetRow; col: towerMenu.targetCol |
| anchors.verticalCenter: parent.verticalCenter |
| towerType: 1; index: 0 |
| canBuild: !towerMenu.towerExists |
| source: "gfx/dialog-melee.png" |
| onClicked: towerMenu.finish() |
| } |
| BuildButton { |
| row: towerMenu.targetRow; col: towerMenu.targetCol |
| anchors.verticalCenter: parent.verticalCenter |
| towerType: 2; index: 1 |
| canBuild: !towerMenu.towerExists |
| source: "gfx/dialog-shooter.png" |
| onClicked: towerMenu.finish() |
| } |
| BuildButton { |
| row: towerMenu.targetRow; col: towerMenu.targetCol |
| anchors.verticalCenter: parent.verticalCenter |
| towerType: 3; index: 2 |
| canBuild: !towerMenu.towerExists |
| source: "gfx/dialog-bomb.png" |
| onClicked: towerMenu.finish() |
| } |
| BuildButton { |
| row: towerMenu.targetRow; col: towerMenu.targetCol |
| anchors.verticalCenter: parent.verticalCenter |
| towerType: 4; index: 3 |
| canBuild: !towerMenu.towerExists |
| source: "gfx/dialog-factory.png" |
| onClicked: towerMenu.finish() |
| } |
| } |
| } |
| |
| |
| Keys.onPressed: { // Cheat Codes while Testing |
| if (event.key == Qt.Key_Up && (event.modifiers & Qt.ShiftModifier)) |
| grid.coins += 10; |
| if (event.key == Qt.Key_Left && (event.modifiers & Qt.ShiftModifier)) |
| grid.lives += 1; |
| if (event.key == Qt.Key_Down && (event.modifiers & Qt.ShiftModifier)) |
| Logic.gameState.waveProgress += 1000; |
| if (event.key == Qt.Key_Right && (event.modifiers & Qt.ShiftModifier)) |
| Logic.endGame(); |
| } |
| |
| Image { |
| id: helpButton |
| z: 1010 |
| source: "gfx/button-help.png" |
| function goAway() { |
| helpMA.enabled = false; |
| helpButton.opacity = 0; |
| } |
| function comeBack() { |
| helpMA.enabled = true; |
| helpButton.opacity = 1; |
| } |
| Behavior on opacity { NumberAnimation {} } |
| MouseArea { |
| id: helpMA |
| anchors.fill: parent |
| onClicked: {helpImage.visible = true; helpButton.visible = false;} |
| } |
| |
| anchors.horizontalCenter: parent.horizontalCenter |
| anchors.bottom: parent.bottom |
| anchors.bottomMargin: 0 |
| } |
| |
| Image { |
| id: helpImage |
| z: 1010 |
| source: "gfx/help.png" |
| anchors.fill: parent |
| visible: false |
| MouseArea { |
| anchors.fill: parent |
| onClicked: helpImage.visible = false; |
| } |
| } |
| |
| } |