Add maroon demo
authorAlan Alpert <alan.alpert@nokia.com>
Fri, 6 Jul 2012 06:23:30 +0000 (16:23 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 12 Jul 2012 04:33:15 +0000 (06:33 +0200)
Change-Id: I880edf78e210d243ef87511e88ea592f6e252da6
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
73 files changed:
doc/src/images/qml-maroon-demo-icon.png [new file with mode: 0644]
examples/demos/demos.pro
examples/demos/maroon/content/BuildButton.qml [new file with mode: 0644]
examples/demos/maroon/content/GameCanvas.qml [new file with mode: 0644]
examples/demos/maroon/content/GameOverScreen.qml [new file with mode: 0644]
examples/demos/maroon/content/InfoBar.qml [new file with mode: 0644]
examples/demos/maroon/content/NewGameScreen.qml [new file with mode: 0644]
examples/demos/maroon/content/SoundEffect.qml [new file with mode: 0644]
examples/demos/maroon/content/audio/bomb-action.wav [new file with mode: 0644]
examples/demos/maroon/content/audio/catch-action.wav [new file with mode: 0644]
examples/demos/maroon/content/audio/catch.wav [new file with mode: 0644]
examples/demos/maroon/content/audio/currency.wav [new file with mode: 0644]
examples/demos/maroon/content/audio/factory-action.wav [new file with mode: 0644]
examples/demos/maroon/content/audio/melee-action.wav [new file with mode: 0644]
examples/demos/maroon/content/audio/projectile-action.wav [new file with mode: 0644]
examples/demos/maroon/content/audio/shooter-action.wav [new file with mode: 0644]
examples/demos/maroon/content/gfx/background.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/bomb-action.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/bomb-idle.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/bomb.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/button-help.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/button-play.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/catch-action.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/catch.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/cloud.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/currency.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/dialog-bomb.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/dialog-factory.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/dialog-melee.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/dialog-pointer.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/dialog-shooter.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/dialog.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/factory-action.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/factory-idle.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/factory.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/grid.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/help.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/lifes.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/logo-bubble.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/logo-fish.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/logo.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/melee-action.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/melee-idle.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/melee.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/mob-idle.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/mob.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/points.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/projectile-action.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/projectile.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/scores.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/shooter-action.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/shooter-idle.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/shooter.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/sunlight.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/text-1.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/text-2.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/text-3.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/text-blank.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/text-gameover.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/text-go.png [new file with mode: 0644]
examples/demos/maroon/content/gfx/wave.png [new file with mode: 0644]
examples/demos/maroon/content/logic.js [new file with mode: 0644]
examples/demos/maroon/content/mobs/MobBase.qml [new file with mode: 0644]
examples/demos/maroon/content/towers/Bomb.qml [new file with mode: 0644]
examples/demos/maroon/content/towers/Factory.qml [new file with mode: 0644]
examples/demos/maroon/content/towers/Melee.qml [new file with mode: 0644]
examples/demos/maroon/content/towers/Ranged.qml [new file with mode: 0644]
examples/demos/maroon/content/towers/TowerBase.qml [new file with mode: 0644]
examples/demos/maroon/main.cpp [new file with mode: 0644]
examples/demos/maroon/maroon.pro [new file with mode: 0644]
examples/demos/maroon/maroon.qdoc [new file with mode: 0644]
examples/demos/maroon/maroon.qml [new file with mode: 0644]
examples/demos/maroon/maroon.qmlproject [new file with mode: 0644]

diff --git a/doc/src/images/qml-maroon-demo-icon.png b/doc/src/images/qml-maroon-demo-icon.png
new file mode 100644 (file)
index 0000000..d8baff8
Binary files /dev/null and b/doc/src/images/qml-maroon-demo-icon.png differ
index d5505c8..1cc19cd 100644 (file)
@@ -1,4 +1,5 @@
 TEMPLATE = subdirs
 SUBDIRS =   calqlatr \
             samegame \
-            tweetsearch
+            tweetsearch \
+            maroon
diff --git a/examples/demos/maroon/content/BuildButton.qml b/examples/demos/maroon/content/BuildButton.qml
new file mode 100644 (file)
index 0000000..d53c08b
--- /dev/null
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+import "logic.js" as Logic
+
+Item {
+    id: container
+    width: 64
+    height: 64
+    property alias source: img.source
+    property int index
+    property int row: 0
+    property int col: 0
+    property int towerType
+    property bool canBuild: true
+    property Item gameCanvas: parent.parent.parent
+    signal clicked()
+
+    Image {
+        id: img
+        opacity: (canBuild && gameCanvas.coins >= Logic.towerData[towerType-1].cost) ? 1.0 : 0.4
+    }
+    Text {
+        anchors.right: parent.right
+        font.pointSize: 14
+        font.bold: true
+        color: "#ffffff"
+        text: Logic.towerData[towerType - 1].cost
+    }
+    MouseArea {
+        anchors.fill: parent
+        onClicked: {
+            Logic.buildTower(towerType, col, row)
+            container.clicked()
+        }
+    }
+    Image {
+        visible: col == index && row != 0
+        source: "gfx/dialog-pointer.png"
+        anchors.top: parent.bottom
+        anchors.topMargin: 4
+        anchors.horizontalCenter: parent.horizontalCenter
+    }
+    Image {
+        visible: col == index && row == 0
+        source: "gfx/dialog-pointer.png"
+        rotation: 180
+        anchors.bottom: parent.top
+        anchors.bottomMargin: 6
+        anchors.horizontalCenter: parent.horizontalCenter
+    }
+}
diff --git a/examples/demos/maroon/content/GameCanvas.qml b/examples/demos/maroon/content/GameCanvas.qml
new file mode 100644 (file)
index 0000000..2cfb2db
--- /dev/null
@@ -0,0 +1,240 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 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;
+        }
+    }
+
+}
diff --git a/examples/demos/maroon/content/GameOverScreen.qml b/examples/demos/maroon/content/GameOverScreen.qml
new file mode 100644 (file)
index 0000000..d4a67a2
--- /dev/null
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+import QtQuick.Particles 2.0
+import "logic.js" as Logic
+
+Item {
+    id: gameOverScreen
+    width: 320
+    height: 400
+    property GameCanvas gameCanvas
+
+    Image {
+        id: img
+        source: "gfx/text-gameover.png"
+        anchors.centerIn: parent
+    }
+
+    ParticleSystem {
+        id: particles
+    }
+
+    ImageParticle {
+        id: cloud
+        anchors.fill: parent
+        system: particles
+        source: "gfx/cloud.png"
+        alphaVariation: 0.25
+        opacity: 0.25
+        smooth: true
+    }
+
+    Wander {
+        system: particles
+        anchors.fill: parent
+        xVariance: 100;
+        pace: 1;
+    }
+
+    Emitter {
+        id: cloudLeft
+        system: particles
+        width: 160
+        height: 160
+        anchors.right: parent.left
+        emitRate: 0.5
+        lifeSpan: 12000
+        velocity: PointDirection{ x: 64; xVariation: 2; yVariation: 2 }
+        size: 160
+    }
+
+    Emitter {
+        id: cloudRight
+        system: particles
+        width: 160
+        height: 160
+        anchors.left: parent.right
+        emitRate: 0.5
+        lifeSpan: 12000
+        velocity: PointDirection{ x: -64; xVariation: 2; yVariation: 2 }
+        size: 160
+    }
+
+    Text {
+        visible: gameCanvas != undefined
+        text: "You saved " + gameCanvas.score + " fishes!"
+        anchors.top: img.bottom
+        anchors.topMargin: 12
+        anchors.horizontalCenter: parent.horizontalCenter
+        font.bold: true
+        color: "#000000"
+        opacity: 0.5
+    }
+
+    Image {
+        source: "gfx/button-play.png"
+        anchors.bottom: parent.bottom
+        anchors.bottomMargin: 0
+        MouseArea {
+            anchors.fill: parent
+            onClicked: gameCanvas.gameOver = false//This will actually trigger the state change in main.qml
+        }
+    }
+}
diff --git a/examples/demos/maroon/content/InfoBar.qml b/examples/demos/maroon/content/InfoBar.qml
new file mode 100644 (file)
index 0000000..6149711
--- /dev/null
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+
+Item {
+    height: childrenRect.height
+
+    // Display the number of lives
+    Row {
+        anchors.left: parent.left
+        anchors.leftMargin: 10
+        spacing: 5
+        Repeater {
+            id: rep
+            model: Math.min(10, canvas.lives)
+            delegate: Image { source: "gfx/lifes.png" }
+        }
+    }
+
+    // Display the number of fishes saved
+    Row {
+        anchors.right: points.left
+        anchors.rightMargin: 20
+        spacing: 5
+        Image { source: "gfx/scores.png" }
+        Text {
+            text: canvas.score
+            font.bold: true
+        }
+    }
+
+    // Display the number of coins
+    Row {
+        id: points
+        anchors.right: parent.right
+        anchors.rightMargin: 10
+        spacing: 5
+        Image { source: "gfx/points.png" }
+        Text {
+            id: pointsLabel
+            text: canvas.coins
+            font.bold: true
+        }
+    }
+}
+
diff --git a/examples/demos/maroon/content/NewGameScreen.qml b/examples/demos/maroon/content/NewGameScreen.qml
new file mode 100644 (file)
index 0000000..d6b6b8c
--- /dev/null
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+
+// This is the first screen.
+// It shows the logo and emit a startButtonClicked signal
+// when the user press the "PLAY" button.
+
+Item {
+    id: newGameScreen
+    width: 320
+    height: 480
+
+    signal startButtonClicked
+
+    Image {
+        source: "gfx/logo.png"
+        anchors.top: parent.top
+        anchors.topMargin: 60
+    }
+
+    Image {
+        source: "gfx/logo-fish.png"
+        anchors.top: parent.top
+
+        SequentialAnimation on x {
+            loops: Animation.Infinite
+            NumberAnimation { from: x + 148; to: x + 25; duration: 2000; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: x + 25; to: x + 148; duration: 1600; easing.type: Easing.InOutQuad }
+        }
+        SequentialAnimation on anchors.topMargin {
+            loops: Animation.Infinite
+            NumberAnimation { from: 100; to: 60; duration: 1600; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: 60; to: 100; duration: 2000; easing.type: Easing.InOutQuad }
+        }
+    }
+
+    Image {
+        source: "gfx/logo-bubble.png"
+        anchors.top: parent.top
+
+        SequentialAnimation on x {
+            loops: Animation.Infinite
+            NumberAnimation { from: x + 140; to: x + 40; duration: 2000; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: x + 40; to: x + 140; duration: 1600; easing.type: Easing.InOutQuad }
+        }
+        SequentialAnimation on anchors.topMargin {
+            loops: Animation.Infinite
+            NumberAnimation { from: 100; to: 60; duration: 1600; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: 60; to: 100; duration: 2000; easing.type: Easing.InOutQuad }
+        }
+        SequentialAnimation on width {
+            loops: Animation.Infinite
+            NumberAnimation { from: 140; to: 160; duration: 1000; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: 160; to: 140; duration: 800; easing.type: Easing.InOutQuad }
+        }
+        SequentialAnimation on height {
+            loops: Animation.Infinite
+            NumberAnimation { from: 150; to: 140; duration: 800; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: 140; to: 150; duration: 1000; easing.type: Easing.InOutQuad }
+        }
+    }
+
+    Image {
+        source: "gfx/button-play.png"
+        anchors.bottom: parent.bottom
+        anchors.bottomMargin: 60
+        MouseArea {
+            anchors.fill: parent
+            onClicked: newGameScreen.startButtonClicked()
+        }
+    }
+}
diff --git a/examples/demos/maroon/content/SoundEffect.qml b/examples/demos/maroon/content/SoundEffect.qml
new file mode 100644 (file)
index 0000000..ce43e34
--- /dev/null
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+//Proxies a SoundEffect if QtMultimedia is installed
+Item {
+    id: container
+    property QtObject effect: Qt.createQmlObject("import QtMultimedia 5.0; SoundEffect{ source: '" + container.source + "' }", container);
+    property url source: ""
+    onSourceChanged: if (effect != null) effect.source = source;
+    function play() {
+        if (effect != null)
+            effect.play();
+    }
+
+}
diff --git a/examples/demos/maroon/content/audio/bomb-action.wav b/examples/demos/maroon/content/audio/bomb-action.wav
new file mode 100644 (file)
index 0000000..b334dc1
Binary files /dev/null and b/examples/demos/maroon/content/audio/bomb-action.wav differ
diff --git a/examples/demos/maroon/content/audio/catch-action.wav b/examples/demos/maroon/content/audio/catch-action.wav
new file mode 100644 (file)
index 0000000..3e22124
Binary files /dev/null and b/examples/demos/maroon/content/audio/catch-action.wav differ
diff --git a/examples/demos/maroon/content/audio/catch.wav b/examples/demos/maroon/content/audio/catch.wav
new file mode 100644 (file)
index 0000000..d3eade8
Binary files /dev/null and b/examples/demos/maroon/content/audio/catch.wav differ
diff --git a/examples/demos/maroon/content/audio/currency.wav b/examples/demos/maroon/content/audio/currency.wav
new file mode 100644 (file)
index 0000000..0d9ef2c
Binary files /dev/null and b/examples/demos/maroon/content/audio/currency.wav differ
diff --git a/examples/demos/maroon/content/audio/factory-action.wav b/examples/demos/maroon/content/audio/factory-action.wav
new file mode 100644 (file)
index 0000000..a2ace6c
Binary files /dev/null and b/examples/demos/maroon/content/audio/factory-action.wav differ
diff --git a/examples/demos/maroon/content/audio/melee-action.wav b/examples/demos/maroon/content/audio/melee-action.wav
new file mode 100644 (file)
index 0000000..d325af4
Binary files /dev/null and b/examples/demos/maroon/content/audio/melee-action.wav differ
diff --git a/examples/demos/maroon/content/audio/projectile-action.wav b/examples/demos/maroon/content/audio/projectile-action.wav
new file mode 100644 (file)
index 0000000..4e2284f
Binary files /dev/null and b/examples/demos/maroon/content/audio/projectile-action.wav differ
diff --git a/examples/demos/maroon/content/audio/shooter-action.wav b/examples/demos/maroon/content/audio/shooter-action.wav
new file mode 100644 (file)
index 0000000..3e12b94
Binary files /dev/null and b/examples/demos/maroon/content/audio/shooter-action.wav differ
diff --git a/examples/demos/maroon/content/gfx/background.png b/examples/demos/maroon/content/gfx/background.png
new file mode 100644 (file)
index 0000000..d548b93
Binary files /dev/null and b/examples/demos/maroon/content/gfx/background.png differ
diff --git a/examples/demos/maroon/content/gfx/bomb-action.png b/examples/demos/maroon/content/gfx/bomb-action.png
new file mode 100644 (file)
index 0000000..42da5d7
Binary files /dev/null and b/examples/demos/maroon/content/gfx/bomb-action.png differ
diff --git a/examples/demos/maroon/content/gfx/bomb-idle.png b/examples/demos/maroon/content/gfx/bomb-idle.png
new file mode 100644 (file)
index 0000000..3bd62e2
Binary files /dev/null and b/examples/demos/maroon/content/gfx/bomb-idle.png differ
diff --git a/examples/demos/maroon/content/gfx/bomb.png b/examples/demos/maroon/content/gfx/bomb.png
new file mode 100644 (file)
index 0000000..380da7d
Binary files /dev/null and b/examples/demos/maroon/content/gfx/bomb.png differ
diff --git a/examples/demos/maroon/content/gfx/button-help.png b/examples/demos/maroon/content/gfx/button-help.png
new file mode 100644 (file)
index 0000000..aecebc1
Binary files /dev/null and b/examples/demos/maroon/content/gfx/button-help.png differ
diff --git a/examples/demos/maroon/content/gfx/button-play.png b/examples/demos/maroon/content/gfx/button-play.png
new file mode 100644 (file)
index 0000000..6cdad6c
Binary files /dev/null and b/examples/demos/maroon/content/gfx/button-play.png differ
diff --git a/examples/demos/maroon/content/gfx/catch-action.png b/examples/demos/maroon/content/gfx/catch-action.png
new file mode 100644 (file)
index 0000000..78ca9fe
Binary files /dev/null and b/examples/demos/maroon/content/gfx/catch-action.png differ
diff --git a/examples/demos/maroon/content/gfx/catch.png b/examples/demos/maroon/content/gfx/catch.png
new file mode 100644 (file)
index 0000000..b7620fe
Binary files /dev/null and b/examples/demos/maroon/content/gfx/catch.png differ
diff --git a/examples/demos/maroon/content/gfx/cloud.png b/examples/demos/maroon/content/gfx/cloud.png
new file mode 100644 (file)
index 0000000..d7c35f8
Binary files /dev/null and b/examples/demos/maroon/content/gfx/cloud.png differ
diff --git a/examples/demos/maroon/content/gfx/currency.png b/examples/demos/maroon/content/gfx/currency.png
new file mode 100644 (file)
index 0000000..1571341
Binary files /dev/null and b/examples/demos/maroon/content/gfx/currency.png differ
diff --git a/examples/demos/maroon/content/gfx/dialog-bomb.png b/examples/demos/maroon/content/gfx/dialog-bomb.png
new file mode 100644 (file)
index 0000000..708d916
Binary files /dev/null and b/examples/demos/maroon/content/gfx/dialog-bomb.png differ
diff --git a/examples/demos/maroon/content/gfx/dialog-factory.png b/examples/demos/maroon/content/gfx/dialog-factory.png
new file mode 100644 (file)
index 0000000..d2e2a48
Binary files /dev/null and b/examples/demos/maroon/content/gfx/dialog-factory.png differ
diff --git a/examples/demos/maroon/content/gfx/dialog-melee.png b/examples/demos/maroon/content/gfx/dialog-melee.png
new file mode 100644 (file)
index 0000000..069d18d
Binary files /dev/null and b/examples/demos/maroon/content/gfx/dialog-melee.png differ
diff --git a/examples/demos/maroon/content/gfx/dialog-pointer.png b/examples/demos/maroon/content/gfx/dialog-pointer.png
new file mode 100644 (file)
index 0000000..9b51a09
Binary files /dev/null and b/examples/demos/maroon/content/gfx/dialog-pointer.png differ
diff --git a/examples/demos/maroon/content/gfx/dialog-shooter.png b/examples/demos/maroon/content/gfx/dialog-shooter.png
new file mode 100644 (file)
index 0000000..af980ca
Binary files /dev/null and b/examples/demos/maroon/content/gfx/dialog-shooter.png differ
diff --git a/examples/demos/maroon/content/gfx/dialog.png b/examples/demos/maroon/content/gfx/dialog.png
new file mode 100644 (file)
index 0000000..d528ba7
Binary files /dev/null and b/examples/demos/maroon/content/gfx/dialog.png differ
diff --git a/examples/demos/maroon/content/gfx/factory-action.png b/examples/demos/maroon/content/gfx/factory-action.png
new file mode 100644 (file)
index 0000000..8981678
Binary files /dev/null and b/examples/demos/maroon/content/gfx/factory-action.png differ
diff --git a/examples/demos/maroon/content/gfx/factory-idle.png b/examples/demos/maroon/content/gfx/factory-idle.png
new file mode 100644 (file)
index 0000000..a145582
Binary files /dev/null and b/examples/demos/maroon/content/gfx/factory-idle.png differ
diff --git a/examples/demos/maroon/content/gfx/factory.png b/examples/demos/maroon/content/gfx/factory.png
new file mode 100644 (file)
index 0000000..bfb9f3f
Binary files /dev/null and b/examples/demos/maroon/content/gfx/factory.png differ
diff --git a/examples/demos/maroon/content/gfx/grid.png b/examples/demos/maroon/content/gfx/grid.png
new file mode 100644 (file)
index 0000000..b595552
Binary files /dev/null and b/examples/demos/maroon/content/gfx/grid.png differ
diff --git a/examples/demos/maroon/content/gfx/help.png b/examples/demos/maroon/content/gfx/help.png
new file mode 100644 (file)
index 0000000..4654e4c
Binary files /dev/null and b/examples/demos/maroon/content/gfx/help.png differ
diff --git a/examples/demos/maroon/content/gfx/lifes.png b/examples/demos/maroon/content/gfx/lifes.png
new file mode 100644 (file)
index 0000000..135310b
Binary files /dev/null and b/examples/demos/maroon/content/gfx/lifes.png differ
diff --git a/examples/demos/maroon/content/gfx/logo-bubble.png b/examples/demos/maroon/content/gfx/logo-bubble.png
new file mode 100644 (file)
index 0000000..136151c
Binary files /dev/null and b/examples/demos/maroon/content/gfx/logo-bubble.png differ
diff --git a/examples/demos/maroon/content/gfx/logo-fish.png b/examples/demos/maroon/content/gfx/logo-fish.png
new file mode 100644 (file)
index 0000000..c41833a
Binary files /dev/null and b/examples/demos/maroon/content/gfx/logo-fish.png differ
diff --git a/examples/demos/maroon/content/gfx/logo.png b/examples/demos/maroon/content/gfx/logo.png
new file mode 100644 (file)
index 0000000..787ac99
Binary files /dev/null and b/examples/demos/maroon/content/gfx/logo.png differ
diff --git a/examples/demos/maroon/content/gfx/melee-action.png b/examples/demos/maroon/content/gfx/melee-action.png
new file mode 100644 (file)
index 0000000..c53873b
Binary files /dev/null and b/examples/demos/maroon/content/gfx/melee-action.png differ
diff --git a/examples/demos/maroon/content/gfx/melee-idle.png b/examples/demos/maroon/content/gfx/melee-idle.png
new file mode 100644 (file)
index 0000000..621d9df
Binary files /dev/null and b/examples/demos/maroon/content/gfx/melee-idle.png differ
diff --git a/examples/demos/maroon/content/gfx/melee.png b/examples/demos/maroon/content/gfx/melee.png
new file mode 100644 (file)
index 0000000..ab24015
Binary files /dev/null and b/examples/demos/maroon/content/gfx/melee.png differ
diff --git a/examples/demos/maroon/content/gfx/mob-idle.png b/examples/demos/maroon/content/gfx/mob-idle.png
new file mode 100644 (file)
index 0000000..dedacc7
Binary files /dev/null and b/examples/demos/maroon/content/gfx/mob-idle.png differ
diff --git a/examples/demos/maroon/content/gfx/mob.png b/examples/demos/maroon/content/gfx/mob.png
new file mode 100644 (file)
index 0000000..7569c35
Binary files /dev/null and b/examples/demos/maroon/content/gfx/mob.png differ
diff --git a/examples/demos/maroon/content/gfx/points.png b/examples/demos/maroon/content/gfx/points.png
new file mode 100644 (file)
index 0000000..1d2386d
Binary files /dev/null and b/examples/demos/maroon/content/gfx/points.png differ
diff --git a/examples/demos/maroon/content/gfx/projectile-action.png b/examples/demos/maroon/content/gfx/projectile-action.png
new file mode 100644 (file)
index 0000000..aa2e650
Binary files /dev/null and b/examples/demos/maroon/content/gfx/projectile-action.png differ
diff --git a/examples/demos/maroon/content/gfx/projectile.png b/examples/demos/maroon/content/gfx/projectile.png
new file mode 100644 (file)
index 0000000..c25a0c3
Binary files /dev/null and b/examples/demos/maroon/content/gfx/projectile.png differ
diff --git a/examples/demos/maroon/content/gfx/scores.png b/examples/demos/maroon/content/gfx/scores.png
new file mode 100644 (file)
index 0000000..af757fe
Binary files /dev/null and b/examples/demos/maroon/content/gfx/scores.png differ
diff --git a/examples/demos/maroon/content/gfx/shooter-action.png b/examples/demos/maroon/content/gfx/shooter-action.png
new file mode 100644 (file)
index 0000000..08e7e30
Binary files /dev/null and b/examples/demos/maroon/content/gfx/shooter-action.png differ
diff --git a/examples/demos/maroon/content/gfx/shooter-idle.png b/examples/demos/maroon/content/gfx/shooter-idle.png
new file mode 100644 (file)
index 0000000..663098d
Binary files /dev/null and b/examples/demos/maroon/content/gfx/shooter-idle.png differ
diff --git a/examples/demos/maroon/content/gfx/shooter.png b/examples/demos/maroon/content/gfx/shooter.png
new file mode 100644 (file)
index 0000000..d44401e
Binary files /dev/null and b/examples/demos/maroon/content/gfx/shooter.png differ
diff --git a/examples/demos/maroon/content/gfx/sunlight.png b/examples/demos/maroon/content/gfx/sunlight.png
new file mode 100644 (file)
index 0000000..d1c7042
Binary files /dev/null and b/examples/demos/maroon/content/gfx/sunlight.png differ
diff --git a/examples/demos/maroon/content/gfx/text-1.png b/examples/demos/maroon/content/gfx/text-1.png
new file mode 100644 (file)
index 0000000..3ea399c
Binary files /dev/null and b/examples/demos/maroon/content/gfx/text-1.png differ
diff --git a/examples/demos/maroon/content/gfx/text-2.png b/examples/demos/maroon/content/gfx/text-2.png
new file mode 100644 (file)
index 0000000..934a481
Binary files /dev/null and b/examples/demos/maroon/content/gfx/text-2.png differ
diff --git a/examples/demos/maroon/content/gfx/text-3.png b/examples/demos/maroon/content/gfx/text-3.png
new file mode 100644 (file)
index 0000000..47523f5
Binary files /dev/null and b/examples/demos/maroon/content/gfx/text-3.png differ
diff --git a/examples/demos/maroon/content/gfx/text-blank.png b/examples/demos/maroon/content/gfx/text-blank.png
new file mode 100644 (file)
index 0000000..4a687b2
Binary files /dev/null and b/examples/demos/maroon/content/gfx/text-blank.png differ
diff --git a/examples/demos/maroon/content/gfx/text-gameover.png b/examples/demos/maroon/content/gfx/text-gameover.png
new file mode 100644 (file)
index 0000000..4f53ef0
Binary files /dev/null and b/examples/demos/maroon/content/gfx/text-gameover.png differ
diff --git a/examples/demos/maroon/content/gfx/text-go.png b/examples/demos/maroon/content/gfx/text-go.png
new file mode 100644 (file)
index 0000000..bfc26f7
Binary files /dev/null and b/examples/demos/maroon/content/gfx/text-go.png differ
diff --git a/examples/demos/maroon/content/gfx/wave.png b/examples/demos/maroon/content/gfx/wave.png
new file mode 100644 (file)
index 0000000..f97426c
Binary files /dev/null and b/examples/demos/maroon/content/gfx/wave.png differ
diff --git a/examples/demos/maroon/content/logic.js b/examples/demos/maroon/content/logic.js
new file mode 100644 (file)
index 0000000..0d7bade
--- /dev/null
@@ -0,0 +1,264 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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$
+**
+****************************************************************************/
+
+.pragma library // Shared game state
+.import QtQuick 2.0 as QQ
+
+// Game Stuff
+var gameState // Local reference
+function getGameState() { return gameState; }
+
+var towerData = [ // Name and cost, stats are in the delegate per instance
+    { "name": "Melee", "cost": 20 },
+    { "name": "Ranged", "cost": 50 },
+    { "name": "Bomb", "cost": 75 },
+    { "name": "Factory", "cost": 25 }
+]
+
+var waveBaseData = [300, 290, 280, 270, 220, 180, 160, 80, 80, 80, 30, 30, 30, 30];
+var waveData = [];
+
+var towerComponents = new Array(towerData.length);
+var mobComponent = Qt.createComponent("mobs/MobBase.qml");
+
+function endGame()
+{
+    gameState.gameRunning = false;
+    gameState.gameOver = true;
+    for (var i = 0; i < gameState.cols; i++) {
+        for (var j = 0; j < gameState.rows; j++) {
+            if (gameState.towers[towerIdx(i, j)]) {
+                gameState.towers[towerIdx(i, j)].destroy();
+                gameState.towers[towerIdx(i, j)] = null;
+            }
+        }
+        for (var j in gameState.mobs[i])
+            gameState.mobs[i][j].destroy();
+        gameState.mobs[i].splice(0,gameState.mobs[i].length); //Leaves queue reusable
+    }
+}
+
+function startGame(gameCanvas)
+{
+    waveData = new Array();
+    for (var i in waveBaseData)
+        waveData[i] = waveBaseData[i];
+    gameState.freshState();
+    for (var i = 0; i < gameCanvas.cols; i++) {
+        for (var j = 0; j < gameCanvas.rows; j++)
+            gameState.towers[towerIdx(i, j)] = null;
+        gameState.mobs[i] = new Array();
+    }
+    gameState.towers[towerIdx(0, 0)] = newTower(3, 0, 0);//Start with a starfish in the corner
+    gameState.gameRunning = true;
+    gameState.gameOver = false;
+}
+
+function newGameState(gameCanvas)
+{
+    for (var i = 0; i < towerComponents.length; i++) {
+        towerComponents[i] = Qt.createComponent("towers/" + towerData[i].name + ".qml");
+        if (towerComponents[i].status == QQ.Component.Error) {
+            gameCanvas.errored = true;
+            gameCanvas.errorString += "Loading Tower " + towerData[i].name + "\n" + (towerComponents[i].errorString());
+            console.log(towerComponents[i].errorString());
+        }
+    }
+    gameState = gameCanvas;
+    gameState.freshState();
+    gameState.towers = new Array(gameCanvas.rows * gameCanvas.cols);
+    gameState.mobs = new Array(gameCanvas.cols);
+    return gameState;
+}
+
+function row(y)
+{
+    return Math.floor(y / gameState.squareSize);
+}
+
+function col(x)
+{
+    return Math.floor(x / gameState.squareSize);
+}
+
+function towerIdx(x, y)
+{
+    return y + (x * gameState.rows);
+}
+
+function newMob(col)
+{
+    var ret = mobComponent.createObject(gameState.canvas,
+        { "col" : col,
+          "speed" : (Math.min(2.0, 0.10 * (gameState.waveNumber + 1))),
+          "y" : gameState.canvas.height });
+    gameState.mobs[col].push(ret);
+    return ret;
+}
+
+function newTower(type, row, col)
+{
+    var ret = towerComponents[type].createObject(gameState.canvas);
+    ret.row = row;
+    ret.col = col;
+    ret.fireCounter = ret.rof;
+    ret.spawn();
+    return ret;
+}
+
+function buildTower(type, x, y)
+{
+    if (gameState.towers[towerIdx(x,y)] != null) {
+        if (type <= 0) {
+            gameState.towers[towerIdx(x,y)].sell();
+            gameState.towers[towerIdx(x,y)] = null;
+        }
+    } else {
+        if (gameState.coins < towerData[type - 1].cost)
+            return;
+        gameState.towers[towerIdx(x, y)] = newTower(type - 1, y, x);
+        gameState.coins -= towerData[type - 1].cost;
+    }
+}
+
+function killMob(col, mob)
+{
+    if (!mob)
+        return;
+    var idx = gameState.mobs[col].indexOf(mob);
+    if (idx == -1 || !mob.hp)
+        return;
+    mob.hp = 0;
+    mob.die();
+    gameState.mobs[col].splice(idx,1);
+}
+
+function killTower(row, col)
+{
+    var tower = gameState.towers[towerIdx(col, row)];
+    if (!tower)
+        return;
+    tower.hp = 0;
+    tower.die();
+    gameState.towers[towerIdx(col, row)] = null;
+}
+
+function tick()
+{
+    if (!gameState.gameRunning)
+        return;
+
+    // Spawn
+    gameState.waveProgress += 1;
+    var i = gameState.waveProgress;
+    var j = 0;
+    while (i > 0 && j < waveData.length)
+        i -= waveData[j++];
+    if ( i == 0 ) // Spawn a mob
+        newMob(Math.floor(Math.random() * gameState.cols));
+    if ( j == waveData.length ) { // Next Wave
+        gameState.waveNumber += 1;
+        gameState.waveProgress = 0;
+        var waveModifier = 10; // Constant governing how much faster the next wave is to spawn (not fish speed)
+        for (var k in waveData ) // Slightly faster
+            if (waveData[k] > waveModifier)
+                waveData[k] -= waveModifier;
+    }
+
+    // Towers Attack
+    for (var j in gameState.towers) {
+        var tower = gameState.towers[j];
+        if (tower == null)
+            continue;
+        if (tower.fireCounter > 0) {
+            tower.fireCounter -= 1;
+            continue;
+        }
+        var column = tower.col;
+        for (var k in gameState.mobs[column]) {
+            var conflict = gameState.mobs[column][k];
+            if (conflict.y <= gameState.canvas.height && conflict.y + conflict.height > tower.y
+                && conflict.y - ((tower.row + 1) * gameState.squareSize) < gameState.squareSize * tower.range) { // In Range
+                tower.fire();
+                tower.fireCounter = tower.rof;
+                conflict.hit(tower.damage);
+            }
+        }
+
+        // Income
+        if (tower.income) {
+            gameState.coins += tower.income;
+            tower.fire();
+            tower.fireCounter = tower.rof;
+        }
+    }
+
+    // Mobs move
+    for (var i = 0; i < gameState.cols; i++) {
+        for (var j = 0; j < gameState.mobs[i].length; j++) {
+            var mob = gameState.mobs[i][j];
+            var newPos = gameState.mobs[i][j].y - gameState.mobs[i][j].speed;
+            if (newPos < 0) {
+                gameState.lives -= 1;
+                killMob(i, mob);
+                if (gameState.lives <= 0)
+                    endGame();
+                continue;
+            }
+            var conflict = gameState.towers[towerIdx(i, row(newPos))];
+            if (conflict != null) {
+                if (mob.y < conflict.y + gameState.squareSize)
+                    gameState.mobs[i][j].y += gameState.mobs[i][j].speed * 10; // Moved inside tower, now hurry back out
+                if (mob.fireCounter > 0) {
+                    mob.fireCounter--;
+                } else {
+                    gameState.mobs[i][j].fire();
+                    conflict.hp -= mob.damage;
+                    if (conflict.hp <= 0)
+                        killTower(conflict.row, conflict.col);
+                    mob.fireCounter = mob.rof;
+                }
+            } else {
+                gameState.mobs[i][j].y = newPos;
+            }
+        }
+    }
+
+}
diff --git a/examples/demos/maroon/content/mobs/MobBase.qml b/examples/demos/maroon/content/mobs/MobBase.qml
new file mode 100644 (file)
index 0000000..0f7df83
--- /dev/null
@@ -0,0 +1,262 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+import "../logic.js" as Logic
+import ".."
+
+Item  {
+    id: container
+    property string name: "Fish"
+    property int col: 0
+    property real hp: 3
+    property real damage: 1
+    property real speed: 0.25
+    property int rof: 30 //In ticks
+    property int fireCounter: 0
+    property bool dying: false
+    width: parent ? parent.squareSize : 0
+    height: parent ? parent.squareSize : 0
+    x: col * width
+    z: 1001
+    function fire() { }
+
+    function die() {
+        if (dying)
+            return;
+        dying = true;
+        bubble.jumpTo("burst");
+        if (fishSprite.currentSprite == "front")
+            fishSprite.jumpTo(Math.random() > 0.5 ? "left" : "right" );
+        fishSwim.start();
+        Logic.gameState.score += 1;
+        killedSound.play();
+        bubble.scale = 0.9
+        destroy(350);
+    }
+
+    function inked() {
+        if (hp > 0)
+            ink.jumpTo("dirty");
+    }
+
+    function hit(dmg) {
+        hp -= dmg;
+
+        if (hp <= 0)
+            Logic.killMob(col, container);
+    }
+
+    Component.onCompleted: spawnSound.play()
+
+    SoundEffect {
+        id: spawnSound
+        source: "../audio/catch.wav"
+    }
+    SoundEffect {
+        id: killedSound
+        source: "../audio/catch-action.wav"
+    }
+
+    SpriteSequence {
+        id: fishSprite
+        width: 64
+        height: 64
+        interpolate: false
+        goalSprite: ""
+
+        Sprite {
+            name: "left"
+            source: "../gfx/mob-idle.png"
+            frameWidth: 64
+            frameHeight: 64
+            frameCount: 1
+            frameDuration: 800
+            frameDurationVariation: 400
+            to: { "front" : 1 }
+        }
+
+        Sprite {
+            name: "front"
+            source: "../gfx/mob-idle.png"
+            frameCount: 1
+            frameX: 64
+            frameWidth: 64
+            frameHeight: 64
+            frameDuration: 800
+            frameDurationVariation: 400
+            to: { "left" : 1, "right" : 1 }
+        }
+
+        Sprite {
+            name: "right"
+            source: "../gfx/mob-idle.png"
+            frameCount: 1
+            frameX: 128
+            frameWidth: 64
+            frameHeight: 64
+            frameDuration: 800
+            frameDurationVariation: 400
+            to: { "front" : 1 }
+        }
+
+
+        Sprite { //WORKAROUND: This prevents the triggering of a rendering error which is currently under investigation.
+            name: "dummy"
+            source: "../gfx/melee-idle.png"
+            frameCount: 8
+            frameWidth: 64
+            frameHeight: 64
+            frameX: 0
+            frameDuration: 200
+        }
+
+        NumberAnimation on x {
+            id: fishSwim
+            running: false
+            property bool goingLeft: fishSprite.currentSprite == "right"
+            to: goingLeft ? -360 : 360
+            duration: 300
+        }
+    }
+
+    SpriteSequence {
+        id: bubble
+        width: 64
+        height: 64
+        scale: 0.4 + (0.2  * hp)
+        interpolate: false
+        goalSprite: ""
+
+        Behavior on scale {
+            NumberAnimation { duration: 150; easing.type: Easing.OutBack }
+        }
+
+        Sprite {
+            name: "big"
+            source: "../gfx/catch.png"
+            frameCount: 1
+            to: { "burst" : 0 }
+        }
+
+        Sprite {
+            name: "burst"
+            source: "../gfx/catch-action.png"
+            frameCount: 3
+            frameX: 64
+            frameDuration: 200
+        }
+
+        Sprite { //WORKAROUND: This prevents the triggering of a rendering error which is currently under investigation.
+            name: "dummy"
+            source: "../gfx/melee-idle.png"
+            frameCount: 8
+            frameWidth: 64
+            frameHeight: 64
+            frameX: 0
+            frameDuration: 200
+        }
+        SequentialAnimation on width {
+            loops: Animation.Infinite
+            NumberAnimation { from: width * 1; to: width * 1.1; duration: 800; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: width * 1.1; to: width * 1; duration: 1000; easing.type: Easing.InOutQuad }
+        }
+        SequentialAnimation on height {
+            loops: Animation.Infinite
+            NumberAnimation { from: height * 1; to: height * 1.15; duration: 1200; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: height * 1.15; to: height * 1; duration: 1000; easing.type: Easing.InOutQuad }
+        }
+    }
+
+    SpriteSequence {
+        id: ink
+        width: 64
+        height: 64
+        scale: bubble.scale
+        goalSprite: ""
+
+        Sprite {
+            name: "clean"
+            source: "../gfx/projectile-action.png"
+            frameCount: 1
+            frameX: 0
+            frameWidth: 64
+            frameHeight: 64
+        }
+        Sprite {
+            name: "dirty"
+            source: "../gfx/projectile-action.png"
+            frameCount: 3
+            frameX: 64
+            frameWidth: 64
+            frameHeight: 64
+            frameDuration: 150
+            to: {"clean":1}
+        }
+
+        Sprite { //WORKAROUND: This prevents the triggering of a rendering error which is currently under investigation.
+            name: "dummy"
+            source: "../gfx/melee-idle.png"
+            frameCount: 8
+            frameWidth: 64
+            frameHeight: 64
+            frameX: 0
+            frameDuration: 200
+        }
+        SequentialAnimation on width {
+            loops: Animation.Infinite
+            NumberAnimation { from: width * 1; to: width * 1.1; duration: 800; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: width * 1.1; to: width * 1; duration: 1000; easing.type: Easing.InOutQuad }
+        }
+        SequentialAnimation on height {
+            loops: Animation.Infinite
+            NumberAnimation { from: height * 1; to: height * 1.15; duration: 1200; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: height * 1.15; to: height * 1; duration: 1000; easing.type: Easing.InOutQuad }
+        }
+
+    }
+
+    SequentialAnimation on x {
+        loops: Animation.Infinite
+        NumberAnimation { from: x; to: x - 5; duration: 900; easing.type: Easing.InOutQuad }
+        NumberAnimation { from: x - 5; to: x; duration: 900; easing.type: Easing.InOutQuad }
+    }
+}
+
diff --git a/examples/demos/maroon/content/towers/Bomb.qml b/examples/demos/maroon/content/towers/Bomb.qml
new file mode 100644 (file)
index 0000000..db3fe30
--- /dev/null
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+import "../logic.js" as Logic
+import ".."
+
+TowerBase {
+    id: container
+    hp: 10
+    range: 0.4
+    rof: 10
+    property real detonationRange: 2.5
+
+    function fire() {
+        sound.play()
+        sprite.jumpTo("shoot")
+        animDelay.start()
+    }
+
+    function finishFire() {
+        var sCol = Math.max(0, col - 1)
+        var eCol = Math.min(Logic.gameState.cols - 1, col + 1)
+        var killList = new Array()
+        for (var i = sCol; i <= eCol; i++) {
+            for (var j = 0; j < Logic.gameState.mobs[i].length; j++)
+                if (Math.abs(Logic.gameState.mobs[i][j].y - container.y) < Logic.gameState.squareSize * detonationRange)
+                    killList.push(Logic.gameState.mobs[i][j])
+            while (killList.length > 0)
+                Logic.killMob(i, killList.pop())
+        }
+        Logic.killTower(row, col);
+    }
+
+    Timer {
+        id: animDelay
+        running: false
+        interval: shootState.frameCount * shootState.frameDuration
+        onTriggered: finishFire()
+    }
+
+    function die()
+    {
+        destroy() // No blink, because we usually meant to die
+    }
+
+    SoundEffect {
+        id: sound
+        source: "../audio/bomb-action.wav"
+    }
+
+    SpriteSequence {
+        id: sprite
+        width: 64
+        height: 64
+        interpolate: false
+        goalSprite: ""
+
+        Sprite {
+            name: "idle"
+            source: "../gfx/bomb-idle.png"
+            frameCount: 4
+            frameDuration: 800
+        }
+
+        Sprite {
+            id: shootState
+            name: "shoot"
+            source: "../gfx/bomb-action.png"
+            frameCount: 6
+            frameDuration: 155
+            to: { "dying" : 1 } // So that if it takes a frame to clean up, it is on the last frame of the explosion
+        }
+
+        Sprite {
+            name: "dying"
+            source: "../gfx/bomb-action.png"
+            frameCount: 1
+            frameX: 64 * 5
+            frameWidth: 64
+            frameHeight: 64
+            frameDuration: 155
+        }
+
+        SequentialAnimation on x {
+            loops: Animation.Infinite
+            NumberAnimation { from: x; to: x + 4; duration: 900; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: x + 4; to: x; duration: 900; easing.type: Easing.InOutQuad }
+        }
+        SequentialAnimation on y {
+            loops: Animation.Infinite
+            NumberAnimation { from: y; to: y - 4; duration: 900; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: y - 4; to: y; duration: 900; easing.type: Easing.InOutQuad }
+        }
+    }
+}
diff --git a/examples/demos/maroon/content/towers/Factory.qml b/examples/demos/maroon/content/towers/Factory.qml
new file mode 100644 (file)
index 0000000..cacd7c6
--- /dev/null
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+import "../logic.js" as Logic
+import ".."
+
+TowerBase {
+    id: container
+    rof: 160
+    income: 5
+    SpriteSequence {
+        id: sprite
+        width: 64
+        height: 64
+        interpolate: false
+        goalSprite: ""
+
+        Sprite {
+            name: "idle"
+            source: "../gfx/factory-idle.png"
+            frameCount: 4
+            frameDuration: 200
+        }
+
+        Sprite {
+            name: "action"
+            source: "../gfx/factory-action.png"
+            frameCount: 4
+            frameDuration: 90
+            to: { "idle" : 1 }
+        }
+
+        SequentialAnimation on x {
+            loops: Animation.Infinite
+            NumberAnimation { from: x; to: x + 4; duration: 900; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: x + 4; to: x; duration: 900; easing.type: Easing.InOutQuad }
+        }
+        SequentialAnimation on y {
+            loops: Animation.Infinite
+            NumberAnimation { from: y; to: y - 4; duration: 900; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: y - 4; to: y; duration: 900; easing.type: Easing.InOutQuad }
+        }
+    }
+
+    SoundEffect {
+        id: actionSound
+        source: "../audio/factory-action.wav"
+    }
+
+    function fire() {
+        actionSound.play()
+        sprite.jumpTo("action")
+        coinLaunch.start()
+    }
+
+    function spawn() {
+        coin.target = Logic.gameState.mapToItem(container, 240, -32)
+    }
+
+    Image {
+        id: coin
+        property var target: { "x" : 0, "y" : 0 }
+        source: "../gfx/currency.png"
+        visible: false
+    }
+
+    SequentialAnimation {
+        id: coinLaunch
+        PropertyAction { target: coin; property: "visible"; value: true }
+        ParallelAnimation {
+            NumberAnimation { target: coin; property: "x"; from: 16; to: coin.target.x }
+            NumberAnimation { target: coin; property: "y"; from: 16; to: coin.target.y }
+        }
+        PropertyAction { target: coin; property: "visible"; value: false }
+    }
+}
diff --git a/examples/demos/maroon/content/towers/Melee.qml b/examples/demos/maroon/content/towers/Melee.qml
new file mode 100644 (file)
index 0000000..e087cd0
--- /dev/null
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+import ".."
+
+TowerBase {
+    hp: 4
+    range: 0.1
+    damage: 1
+    rof: 40
+    income: 0
+
+    SpriteSequence {
+        id: sprite
+        width: 64
+        height: 64
+        interpolate: false
+        goalSprite: ""
+
+        Sprite {
+            name: "idle"
+            source: "../gfx/melee-idle.png"
+            frameCount: 8
+            frameDuration: 250
+        }
+
+        Sprite {
+            name: "shoot"
+            source: "../gfx/melee-action.png"
+            frameCount: 2
+            frameDuration: 200
+            to: { "idle" : 1 }
+        }
+    }
+
+    function fire() {
+        shootSound.play()
+        sprite.jumpTo("shoot")
+    }
+
+    SoundEffect {
+        id: shootSound
+        source: "../audio/melee-action.wav"
+    }
+}
diff --git a/examples/demos/maroon/content/towers/Ranged.qml b/examples/demos/maroon/content/towers/Ranged.qml
new file mode 100644 (file)
index 0000000..1f9da39
--- /dev/null
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+import "../logic.js" as Logic
+import ".."
+
+TowerBase {
+    id: container
+    hp: 2
+    range: 6
+    damage: 0 // By projectile
+    rof: 40
+    income: 0
+    property var targetMob
+    property real realDamage: 1
+    function fire() {
+        proj.x = 32 - proj.width / 2
+        proj.y = 0
+        targetMob = Logic.gameState.mobs[col][0]
+        projAnim.to = targetMob.y - container.y -10
+        projAnim.start()
+        shootSound.play()
+        sprite.jumpTo("shoot")
+    }
+
+    Image {
+        id: proj
+        y: 1000
+        SequentialAnimation on y {
+            id: projAnim
+            running: false
+            property real to: 1000
+            SmoothedAnimation {
+                to: projAnim.to
+                velocity: 400
+            }
+            ScriptAction {
+                script: {
+                    if (targetMob && targetMob.hit) {
+                        targetMob.hit(realDamage)
+                        targetMob.inked()
+                        projSound.play()
+                    }
+                }
+            }
+            PropertyAction {
+                value: 1000;
+            }
+        }
+        source: "../gfx/projectile.png"
+    }
+
+    SoundEffect {
+        id: shootSound
+        source: "../audio/shooter-action.wav"
+    }
+    SoundEffect {
+        id: projSound
+        source: "../audio/projectile-action.wav"
+    }
+
+    SpriteSequence {
+        id: sprite
+        width: 64
+        height: 64
+        interpolate: false
+        goalSprite: ""
+
+        Sprite {
+            name: "idle"
+            source: "../gfx/shooter-idle.png"
+            frameCount: 4
+            frameDuration: 250
+        }
+
+        Sprite {
+            name: "shoot"
+            source: "../gfx/shooter-action.png"
+            frameCount: 5
+            frameDuration: 90
+            to: { "idle" : 1 }
+        }
+
+        SequentialAnimation on x {
+            loops: Animation.Infinite
+            NumberAnimation { from: x; to: x - 4; duration: 900; easing.type: Easing.InOutQuad }
+            NumberAnimation { from: x - 4; to: x; duration: 900; easing.type: Easing.InOutQuad }
+        }
+    }
+}
diff --git a/examples/demos/maroon/content/towers/TowerBase.qml b/examples/demos/maroon/content/towers/TowerBase.qml
new file mode 100644 (file)
index 0000000..bafa874
--- /dev/null
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+
+Item {
+    property real hp: 1
+    property real range: 0
+    property real damage: 0
+    property int rof: 100
+    property int fireCounter: 0
+    property int income: 0
+    property int row: 0
+    property int col: 0
+
+    width: parent ? parent.squareSize : 0
+    height: parent ? parent.squareSize : 0
+    //This is how it is placed on the gameboard, do not modify/animate the X/Y/Z of a TowerBase please
+    x: col * width
+    y: row * height
+    z: 1000
+
+    function fire() { }
+    function spawn() { } //After all game properties are set
+    function die() { stdDeath.start(); destroy(1000); }
+    function sell() { destroy(); }
+
+    SequentialAnimation on opacity {
+        id: stdDeath
+        running: false
+        loops: 2
+        NumberAnimation { from: 1; to: 0; }
+        NumberAnimation { from: 0; to: 1; }
+    }
+}
diff --git a/examples/demos/maroon/main.cpp b/examples/demos/maroon/main.cpp
new file mode 100644 (file)
index 0000000..84eb4e3
--- /dev/null
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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$
+**
+****************************************************************************/
+#include "../../shared/shared.h"
+DECLARATIVE_EXAMPLE_MAIN(maroon)
diff --git a/examples/demos/maroon/maroon.pro b/examples/demos/maroon/maroon.pro
new file mode 100644 (file)
index 0000000..32d1e43
--- /dev/null
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+QT += qml quick
+SOURCES += main.cpp
+
+target.path = $$[QT_INSTALL_EXAMPLES]/qtdeclarative/demos/maroon
+qml.files = maroon.qml content
+qml.path = $$[QT_INSTALL_EXAMPLES]/qtdeclarative/demos/maroon
+INSTALLS += target qml
diff --git a/examples/demos/maroon/maroon.qdoc b/examples/demos/maroon/maroon.qdoc
new file mode 100644 (file)
index 0000000..1b30033
--- /dev/null
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** GNU Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file.
+**
+** 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$
+**
+****************************************************************************/
+
+/*!
+    \title QML Demos - Maroon in Trouble
+    \example demos/maroon
+    \brief This is an example game written in QML.
+    \image qml-maroon-demo-icon.png
+
+    The Maroon in Trouble game demonstrates some of the UI effects that QtQuick provides to
+    make UIs more visually rich. It take a simple tower defense game and then jazzes it up with
+    animated sprites, particle effects, and sound effects (if the QtMultimedia module is available).
+
+    The game also demonstrates the extensibility of QML, by making it easy to add more types of tower
+    for the player to build. Advanced QML users should be able to play around with adding additional
+    types of towers or mobs.
+
+*/
+
diff --git a/examples/demos/maroon/maroon.qml b/examples/demos/maroon/maroon.qml
new file mode 100644 (file)
index 0000000..c3b736b
--- /dev/null
@@ -0,0 +1,239 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples 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 2.0
+import QtQuick.Particles 2.0
+import "content"
+import "content/logic.js" as Logic
+
+Item {
+    id: root
+    width: 320
+    height: 480
+    property var gameState: Logic.newGameState(canvas);
+    property bool passedSplash: false
+
+    Image {
+        source:"content/gfx/background.png"
+        anchors.bottom: view.bottom
+
+        ParticleSystem {
+            id: particles
+        }
+
+        ImageParticle {
+            id: bubble
+            anchors.fill: parent
+            system: particles
+            source: "content/gfx/catch.png"
+            opacity: 0.25
+            smooth: true
+        }
+        Wander {
+            system: particles
+            anchors.fill: parent
+            xVariance: 25;
+            pace: 25;
+        }
+
+        Emitter {
+            id: fire
+            system: particles
+
+            width: parent.width
+            height: 150
+            anchors.bottom: parent.bottom
+            anchors.bottomMargin: 3
+            startTime: 15000
+
+            emitRate: 2
+            lifeSpan: 15000
+
+            acceleration: PointDirection{ y: -6; xVariation: 2; yVariation: 2 }
+
+            size: 24
+            sizeVariation: 16
+        }
+
+    }
+
+    Column {
+        id: view
+        y: -(height - 480)
+        width: 320
+
+        GameOverScreen { gameCanvas: canvas }
+
+        Item {
+            id: canvasArea
+            width: 320
+            height: 480
+
+            Row {
+                height: childrenRect.height
+                Image {
+                    id: wave
+                    y: 30
+                    source:"content/gfx/wave.png"
+                }
+                Image {
+                    y: 30
+                    source:"content/gfx/wave.png"
+                }
+                NumberAnimation on x { from: 0; to: -(wave.width); duration: 16000; loops: Animation.Infinite }
+                SequentialAnimation on y {
+                    loops: Animation.Infinite
+                    NumberAnimation { from: y - 2; to: y + 2; duration: 1600; easing.type: Easing.InOutQuad }
+                    NumberAnimation { from: y + 2; to: y - 2; duration: 1600; easing.type: Easing.InOutQuad }
+                }
+            }
+
+            Row {
+                opacity: 0.5
+                Image {
+                    id: wave2
+                    y: 25
+                    source: "content/gfx/wave.png"
+                }
+                Image {
+                    y: 25
+                    source: "content/gfx/wave.png"
+                }
+                NumberAnimation on x { from: -(wave2.width); to: 0; duration: 32000; loops: Animation.Infinite }
+                SequentialAnimation on y {
+                    loops: Animation.Infinite
+                    NumberAnimation { from: y + 2; to: y - 2; duration: 1600; easing.type: Easing.InOutQuad }
+                    NumberAnimation { from: y - 2; to: y + 2; duration: 1600; easing.type: Easing.InOutQuad }
+                }
+            }
+
+            Image {
+                source: "content/gfx/sunlight.png"
+                opacity: 0.02
+                y: 0
+                anchors.horizontalCenter: parent.horizontalCenter
+                transformOrigin: Item.Top
+                SequentialAnimation on rotation {
+                    loops: Animation.Infinite
+                    NumberAnimation { from: -10; to: 10; duration: 8000; easing.type: Easing.InOutSine }
+                    NumberAnimation { from: 10; to: -10; duration: 8000; easing.type: Easing.InOutSine }
+                }
+            }
+
+            Image {
+                source: "content/gfx/sunlight.png"
+                opacity: 0.04
+                y: 20
+                anchors.horizontalCenter: parent.horizontalCenter
+                transformOrigin: Item.Top
+                SequentialAnimation on rotation {
+                    loops: Animation.Infinite
+                    NumberAnimation { from: 10; to: -10; duration: 8000; easing.type: Easing.InOutSine }
+                    NumberAnimation { from: -10; to: 10; duration: 8000; easing.type: Easing.InOutSine }
+                }
+            }
+
+            Image {
+                source: "content/gfx/grid.png"
+                opacity: 0.5
+            }
+
+            GameCanvas {
+                id: canvas
+                anchors.bottom: parent.bottom
+                anchors.bottomMargin: 20
+                x: 32
+                focus: true
+            }
+
+            InfoBar { anchors.bottom: canvas.top; anchors.bottomMargin: 6; width: parent.width }
+
+            //3..2..1..go
+            Timer {
+                id: countdownTimer
+                interval: 1000
+                running: root.countdown < 5
+                repeat: true
+                onTriggered: root.countdown++
+            }
+            Repeater {
+                model: ["content/gfx/text-blank.png", "content/gfx/text-3.png", "content/gfx/text-2.png", "content/gfx/text-1.png", "content/gfx/text-go.png"]
+                delegate: Image {
+                    visible: root.countdown <= index
+                    opacity: root.countdown == index ? 0.5 : 0.1
+                    scale: root.countdown >= index ? 1.0 : 0.0
+                    source: modelData
+                    Behavior on opacity { NumberAnimation {} }
+                    Behavior on scale { NumberAnimation {} }
+                }
+            }
+        }
+
+        NewGameScreen {
+            onStartButtonClicked: root.passedSplash = true
+        }
+    }
+
+    property int countdown: 10
+    Timer {
+        id: gameStarter
+        interval: 4000
+        running: false
+        repeat: false
+        onTriggered: Logic.startGame(canvas);
+    }
+
+    states: [
+        State {
+            name: "gameOn"; when: gameState.gameOver == false && passedSplash
+            PropertyChanges { target: view; y: -(height - 960) }
+            StateChangeScript { script: root.countdown = 0; }
+            PropertyChanges { target: gameStarter; running: true }
+        },
+        State {
+            name: "gameOver"; when: gameState.gameOver == true
+            PropertyChanges { target: view; y: 0 }
+        }
+    ]
+
+    transitions: Transition {
+        NumberAnimation { properties: "x,y"; duration: 1200; easing.type: Easing.OutQuad }
+    }
+}
diff --git a/examples/demos/maroon/maroon.qmlproject b/examples/demos/maroon/maroon.qmlproject
new file mode 100644 (file)
index 0000000..7526661
--- /dev/null
@@ -0,0 +1,16 @@
+import QmlProject 1.1
+
+Project {
+    mainFile: "maroon.qml"
+
+    /* Include .qml, .js, and image files from current directory and subdirectories */
+    QmlFiles {
+        directory: "."
+    }
+    JavaScriptFiles {
+        directory: "."
+    }
+    ImageFiles {
+        directory: "."
+    }
+}