Level.qml Example File

demos/mobile/quickhit/plugins/LevelTwo/qml/Level.qml
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of The Qt Company Ltd nor the names of its
**     contributors may be used to endorse or promote products derived
**     from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
import QtQuick 1.0
import Qt.labs.particles 1.0
import "Level.js" as LevelScript
Item {
    id: enemies
    anchors.fill: parent
    property int enemiesCreated: 0
    property int enemiesEnabled: 0
    property int backOneTop
    property int backTwoTop
    // Long background 2
    Image {
        id: longBackground_2
        source: "file:/"+LevelPlugin.pictureRootPath()+"background_loop.png"
        fillMode: Image.Stretch
        smooth: false
        width: gameArea.width
        height: gameArea.height
    }
    // Long background 1
    Image {
        id: longBackground_1
        source: "file:/"+LevelPlugin.pictureRootPath()+"background_loop.png"
        fillMode: Image.Stretch
        smooth: false
        width: gameArea.width
        height: gameArea.height
    }
    // Long background Up to down animation
     ParallelAnimation {
        id: backgroundAnim;
        loops: Animation.Infinite
        PropertyAnimation { target:longBackground_1; property:"y";
        from:backOneTop; to:gameArea.height; easing.type:Easing.Linear; duration:10000 }
        PropertyAnimation { target:longBackground_2; property:"y";
        from:backTwoTop; to:backOneTop; easing.type:Easing.Linear; duration:10000 }
     }
    // ***************************************************
    // *** NOTE: This is mandatory for all level QML files
    function pause(doPause) {
        if (doPause) {
            enemyCreationTimer.stop()
            backgroundAnim.stop()
        } else {
            enemyCreationTimer.restart()
            backgroundAnim.restart()
        }
        for (var i=0;i<LevelScript.hiddenEnemies.length;i++) {
            var enemy = LevelScript.hiddenEnemies[i]
            enemy.pause(doPause)
        }
    }
    // ***************************************************
    // *** NOTE: This is mandatory for all level QML files
    objectName: "level"
    // Enemy creation timer
    Timer {
        id: enemyCreationTimer
        interval: 1000; running: false; repeat: true
        onTriggered: {
            enableEnemy()
        }
    }
    function enableEnemy() {
        if (enemiesEnabled < enemiesCreated) {
            var enemy = LevelScript.hiddenEnemies[enemiesEnabled]
            enemy.opacity = 1
            enemy.x = GameEngine.randInt(0,gameArea.width-enemy.width-50)
            enemy.startMovingAnim()
            enemyCreationTimer.stop()
            enemyCreationTimer.interval = GameEngine.randInt(500,2000)
            enemyCreationTimer.restart()
            enemiesEnabled = enemiesEnabled + 1
            GameEngine.playSound(4) // NOTE: Enable enemy sound
        } else {
            enemyCreationTimer.stop()
        }
    }
    // Hidden enemies group
    function createHiddenEnemiesGroup() {
        for (var i=0;i<LevelPlugin.enemyCount();i++) {
            var enemyComponent = Qt.createComponent("file:/"+LevelPlugin.qmlRootPath()+"Enemy.qml")
            var enemyObject = enemyComponent.createObject(enemies)
            LevelScript.hiddenEnemies.push(enemyObject)
            enemiesCreated = enemiesCreated + 1
        }
    }
    Component.onCompleted: {
        // Create hidden enemies
        createHiddenEnemiesGroup()
        // Flying moons animation
        starBurstTimer.restart()
        // Create enemies timer
        enemyCreationTimer.restart()
        // Start Long background loop animation
        backOneTop = 0
        longBackground_1.y = backOneTop;
        backTwoTop = gameArea.height * -1
        longBackground_2.y = backTwoTop;
        backgroundAnim.restart()
        GameEngine.playSounds(5,3)  //NOTE: Level starts sound, 3 times
    }
    Timer {
        id: starBurstTimer
        interval: starParticles.lifeSpan+GameEngine.randInt(100,2000); running: false; repeat: true
        onTriggered: {
        starParticles.burst(GameEngine.randInt(4,6))
        }
     }
    // ***************************************************
    // *** NOTE: This is mandatory for all level QML files
    // Execute explode particle effect
    function explode(x,y) {
        explodeParticles.x = x
        explodeParticles.y = y
        explodeParticles.burst(20)
        explodeParticles.opacity = 1
    }
    // ***************************************************
    // *** NOTE: This is mandatory for all level QML files
    // Explode particle effect
    Particles {
        id: explodeParticles
        opacity: 0
        width: 1
        height: 1
        emissionRate: 0
        source: "file:/"+LevelPlugin.pictureRootPath()+"blue_fire.png"
        lifeSpan: 500
        lifeSpanDeviation: 2000
        count: -1
        angle: 270
        angleDeviation: 65
        velocity: 100
        velocityDeviation: 100
        ParticleMotionGravity {
            yattractor: 1000
            xattractor: 300
            acceleration: 50
        }
    }
  Particles {
         id: starParticles
         y: -50
         x: 0
         width: parent.width
         height: 50
         emissionRate: 0
         source: "file:/"+LevelPlugin.pictureRootPath()+"star3.png"
         lifeSpan: 5000
         count: -1
         angle: 90
         velocity: 100
         opacity: 0.7
        ParticleMotionGravity {
            yattractor: 1000
            xattractor: 500
        }
     }
}