Game.qml Example File
demos/mobile/quickhit/Game.qml
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** 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 Nokia Corporation and its Subsidiary(-ies) 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 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 }
}
}