mirror of https://github.com/qt/qtdoc.git
203 lines
5.8 KiB
QML
203 lines
5.8 KiB
QML
// Copyright (C) 2017 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
import QtQuick
|
|
import "logic.js" as Logic
|
|
|
|
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: grid.errorString
|
|
visible: grid.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: function (mouse) {
|
|
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 { 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: function (event) { // 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;
|
|
}
|
|
}
|
|
|
|
}
|