/**************************************************************************** ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/ ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this ** file. Please review the following information to ensure the GNU Lesser ** General Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU General ** Public License version 3.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of this ** file. Please review the following information to ensure the GNU General ** Public License version 3.0 requirements will be met: ** http://www.gnu.org/copyleft/gpl.html. ** ** Other Usage ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 1.0 import "Game.js" as GameScript Item { id: gameArea width: 360; height: 640 // NOTE: have to exists some default sizes anchors.fill: parent objectName: "gameArea" // Who win, you or computer property bool gameOverProperty: false // for info message to user property variant messageBox // Level activated signal for Qt side to load activated level signal levelActivated(int index) // Pause whole game, if level is loaded function pauseGame() { if (GameScript.levelPlugin) { GameScript.pauseGame(true) myShip.focus = false btnPause.opacity = 0 menu.showPauseMenu() } } // Qt side call this for QML take new level into use function levelReadyForCreation() { // Hide menu menu.hideMenu() // Show message message.showMessage("Loading Level...",2000) // Wait before create level levelCreationTimer.restart() } // Fires ememy missile. Function is called from Qt side function fireEnemyMissile(aXpox, aFromYpos, aToYpos) { GameScript.fireEnemyMissile(aXpox, aFromYpos, aToYpos) } // Game Over handling. Function is called from Qt side function gameOver(youWin) { // Stop GameEngine timers GameEngine.enableEngineTimer(false) gameOverProperty = youWin GameScript.hideMissiles() gameOverTimer.restart() //GameEngine.vibra() } // End game and show menu function endGame(showMessage) { backgroundPic.opacity = 1 // Stop GameEngine timers GameEngine.enableEngineTimer(false) // Do game over GameScript.gameOver() GameScript.hideMissiles() // Clear GameEngine QML objects GameEngine.clearQmlObjects() myShip.opacity = 0 myShip.focus = false btnPause.opacity = 0 idMainLogo.opacity = 1 menu.showLevelMenu() if (showMessage) { message.showMessage("Game End",2000) } } // Timer for level creationing Timer { id: levelCreationTimer interval: 1000; running: false; repeat: false onTriggered: { btnPause.opacity = 1 myShip.opacity = 1 myShip.focus = true // Create new level var ret = GameScript.createLevel() if (ret==0) { backgroundPic.opacity = 0 // Find QML object for GameEngine GameEngine.findQmlObjects() // Enable GameEngine timer GameEngine.enableEngineTimer(true) } else { // Level cannot be created! endGame(false) } } } // Timer for game over Timer { id: gameOverTimer interval: 1500; running: false; repeat: false onTriggered: { backgroundPic.opacity = 1 idMainLogo.opacity = 1 // Do game over GameScript.gameOver() // Clear GameEngine QML objects GameEngine.clearQmlObjects() menu.showLevelMenu() if (gameOverProperty) { GameEngine.playInternalSound(4) message.showMessage("Game Over, You win!",2000) } else { GameEngine.playInternalSounds(3,3) message.showMessage("Game Over, You lose",2000) } } } // Menu signal to slot connections Connections { target: menu // Level selected onLevelSelected: { // Stop bigship animation bigShipAnim.stop() bigShip.opacity = 0 // Hide logo idMainLogo.opacity = 0 // Signal level activated gameArea.levelActivated(levelIndex) } // Level resumed selected onResumeSelected: { menu.hideMenu() GameScript.pauseGame(false) myShip.focus = true } } // This component creation completed Component.onCompleted: { // Show main Level selection menu menu.showLevelMenu() // Start big ship animation bigShipAnim.restart() // Set variable messageBox = message // Play game start sound GameEngine.gameStartSound() // Fade splash screen fadeAnim.restart() // Rotate splash logo rotAnim.restart() } // Background image for the game Image { id: backgroundPic z:1 source: "qrc:/gfx/background2.png" fillMode: Image.PreserveAspectCrop smooth: true anchors.fill: parent } Image { id: bigShip source: "qrc:/gfx/bigship.png" z:1.5 smooth: true x: width * -1 y: parent.height * 0.55 } SequentialAnimation { id: bigShipAnim; NumberAnimation {target:bigShip; property:"x"; to:gameArea.width; easing.type: Easing.Linear; duration: 80000 } PropertyAction {target:bigShip; properties: "opacity"; value: 0} } // Enemies grid Item { // This is general level QML plaseholder // Into this is level QML created in createLevel() id:levelId anchors.fill: parent z:2 } Image { id: idMainLogo z:19 source: "qrc:/gfx/quickhit_logo.png" smooth: true anchors.horizontalCenter: gameArea.horizontalCenter y:gameArea.height / 10 * 1 } // Game menu Menu { z:20 id:menu width: gameArea.width / 5 * 4 height: gameArea.height / 10 * 4 anchors.verticalCenter: gameArea.verticalCenter anchors.horizontalCenter: gameArea.horizontalCenter } // My ship MyShip { z:10 id: myShip opacity: 0 } // Mouse area of your ship MouseArea { //anchors.fill: parent width: parent.width height: myShip.height x:0 y:gameArea.height - myShip.height drag.target: myShip drag.axis: Drag.XAxis drag.minimumX: 0 drag.maximumX: gameArea.width - myShip.width property int startPos: 0 property int dragCount: 0 onPressed: { startPos = mouseX dragCount = 0 } onPositionChanged: { //dragCount = Math.abs(mouseX-startPos) } onReleased: { //if (dragCount<20) { myShip.fire() //} } } // Pause button Button { id: btnSound z:12 //animationEnabled: false anchors.top: parent.top anchors.topMargin: 10 buttonPath: "qrc:/gfx/soundOn.png" buttonId: 4 width: gameArea.width / 10 height: gameArea.width / 10 x: gameArea.width - width - 15 opacity: 1 Connections { target: btnSound onBtnClicked: { if (btnSound.buttonId==4) { // Sound off btnSound.buttonPath = "qrc:/gfx/soundOff.png" btnSound.buttonId = 5 GameEngine.enableSounds(false) } else { // Sound on btnSound.buttonPath = "qrc:/gfx/soundOn.png" btnSound.buttonId = 4 GameEngine.enableSounds(true) } } } } // Pause button Button { id: btnPause z:13 anchors.top: parent.top anchors.topMargin: 10 buttonPath: "qrc:/gfx/pause.png" buttonId: 3 width: gameArea.width / 10 height: gameArea.width / 10 x: gameArea.width - width - btnPause.width - 15*2 opacity: 0 Connections { target: btnPause onBtnClicked: { GameScript.pauseGame(true) myShip.focus = false btnPause.opacity = 0 menu.showPauseMenu() } } } // Hidden missiles ready for to be launched Missile { z:3 id: missile_1 x:0 y:10 } Missile { z:4 id: missile_2 x: 20 y:10 } Missile { z:5 id: missile_3 x: 40 y:10 } Missile { z:6 id: missile_4 x: 60 y:10 } Missile { z:7 id: missile_5 x: 80 y:10 } Missile { z:8 objectName: "enemy_missile" id: enemy_missile_1 enemyMissile: true } Missile { z:9 objectName: "enemy_missile" id: enemy_missile_2 enemyMissile: true } // Messages to the user Message { id: message z:21 } // Splach screen Rectangle { id: blackFace x:-2 y:0 width: parent.width + 2 height: parent.height z:100 color: "black" opacity: 1 MouseArea { anchors.fill: parent onPressed: { mouse.accepted = true fadeAnim.stop() blackFace.opacity = 0 } } Image { id: idLogo source: "qrc:/gfx/quickhit_logo.png" smooth: true anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter opacity: 0 } NumberAnimation { id: rotAnim; target: idLogo; property: "rotation"; to: 20; duration: 9000 } } // Splach screen animation SequentialAnimation { id: fadeAnim PauseAnimation {duration: 1000 } NumberAnimation {target: idLogo; property: "opacity"; from: 0; to: 1; duration: 2000 } PauseAnimation {duration: 2000 } NumberAnimation {target: idLogo; property: "opacity"; from: 1; to: 0; duration: 2000 } NumberAnimation {target: blackFace; property: "opacity"; from: 1; to: 0; duration: 2000 } } }