diff options
Diffstat (limited to 'examples/mobile/quickhit/gameengine.cpp')
-rw-r--r-- | examples/mobile/quickhit/gameengine.cpp | 593 |
1 files changed, 0 insertions, 593 deletions
diff --git a/examples/mobile/quickhit/gameengine.cpp b/examples/mobile/quickhit/gameengine.cpp deleted file mode 100644 index 0b1ccf11..00000000 --- a/examples/mobile/quickhit/gameengine.cpp +++ /dev/null @@ -1,593 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the demonstration applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "gameengine.h" -#include "plugins/levelplugininterface.h" -#include "InvSounds.h" - -#include <QDebug> -#include <QTimerEvent> -#include <QTime> -#include <QDesktopServices> - -const int TIMER_SPEED = 80; - -GameEngine::GameEngine(QObject* parent) - :QObject(parent) -{ - m_timerId = 0; - m_doEnemyMissile = 1500 / TIMER_SPEED; - m_GameGml = 0; - m_gameLevel = 0; - - clearQmlObjects(); - - // For random - QTime time = QTime::currentTime(); - qsrand((uint)time.msec()); - - // Sound engine - m_soundEngine = new CInvSounds(this); - - // Device profile - m_silent = false; - -#ifdef Q_OS_SYMBIAN - iVibrate = CHWRMVibra::NewL(); -#endif - - // Get device profile, is it silent? -#if defined Q_OS_SYMBIAN || defined Q_WS_MAEMO_5 - m_systemDeviceInfo = new QSystemDeviceInfo(this); - QObject::connect(m_systemDeviceInfo,SIGNAL(currentProfileChanged(QSystemDeviceInfo::Profile)),this, - SLOT(currentProfileChanged(QSystemDeviceInfo::Profile))); - QSystemDeviceInfo::Profile p = m_systemDeviceInfo->currentProfile(); - if (p == QSystemDeviceInfo::SilentProfile) { - m_silent = true; - } -#endif - -} - - -GameEngine::~GameEngine() -{ -#ifdef Q_OS_SYMBIAN - delete iVibrate; -#endif - -} - -void GameEngine::gameStartSound() -{ - if (!m_silent) - m_soundEngine->gameStartSound(); -} - -#if defined Q_OS_SYMBIAN || defined Q_WS_MAEMO_5 -void GameEngine::currentProfileChanged(QSystemDeviceInfo::Profile p) -{ - if (p == QSystemDeviceInfo::SilentProfile) { - enableSounds(QVariant(false)); - } else { - enableSounds(QVariant(true)); - } -} -#endif - -void GameEngine::enableSounds(QVariant enable) -{ - m_silent = !enable.toBool(); - - if (m_silent) - this->m_soundEngine->enableSounds(false); - else - this->m_soundEngine->enableSounds(true); - -} - -QVariant GameEngine::randInt(QVariant low, QVariant high) -{ - // Random number between low and high - return qrand() % ((high.toInt() + 1) - low.toInt()) + low.toInt(); -} - -void GameEngine::setGameLevel(LevelPluginInterface* level) -{ - // Set used game level - m_gameLevel = level; - - if (m_gameLevel) { - // Set used sound from the level into sound engine - m_soundEngine->enableSounds(m_gameLevel->levelSounds()); - // Invoke QML to take new level in use - QMetaObject::invokeMethod(m_GameGml, "levelReadyForCreation", Qt::AutoConnection); - - m_doEnemyMissile = m_gameLevel->enemyFireSpeed().toInt() / TIMER_SPEED; - } -} - -void GameEngine::setPluginList(QList<QPluginLoader*> plugins) -{ - m_pluginList = plugins; -} - -QVariant GameEngine::pluginList() -{ - QStringList list; - QPluginLoader* loader; - foreach (loader,m_pluginList) { - QString s = loader->fileName(); - s = s.mid(s.lastIndexOf("/")+1); - s = s.left(s.lastIndexOf(".")); - s = s.toUpper(); -#ifdef Q_WS_MAEMO_5 - if (s.contains("LIB")) { - s = s.right(s.length() - (s.indexOf("LIB")+3)); - } -#endif - list.append(s); - } - return QVariant(list); -} - -void GameEngine::pauseLevel(QVariant doPause) -{ - bool enableTimer = !doPause.toBool(); - enableEngineTimer(QVariant(enableTimer)); - QMetaObject::invokeMethod(m_levelQml, "pause", Qt::AutoConnection,Q_ARG(QVariant, doPause)); -} - - -void GameEngine::findQmlObjects() -{ - if (m_GameGml) { - qDebug() << "GameEngine::findQmlObjects()"; - - // Find Missiles objects - m_missileList.clear(); - m_enemyMissileList.clear(); - findMissiles(m_GameGml); - - // Set QMLs - setLevelQml(m_GameGml->findChild<QObject*>("level")); - setEnemiesGridQml(m_GameGml->findChild<QObject*>("enemiesGrid")); - setMyShipQml(m_GameGml->findChild<QObject*>("myShip")); - - // Find Enemies objects - m_enemyList.clear(); - qDebug() << "GameEngine::findQmlObjects() find enemies from: level QML"; - findEnemies(m_levelQml); - - - } else { - qDebug() << "GameEngine::findQmlObjects() rootObject NULL"; - } -} - -void GameEngine::clearQmlObjects() -{ - m_missileList.clear(); - m_enemyMissileList.clear(); - m_enemyList.clear(); - m_levelQml = 0; - m_enemiesGridGml = 0; - m_myShipGml = 0; - //m_GameGml = 0; // NOTE: Do not delete this -} - - -void GameEngine::findMissiles(QObject *rootObject) -{ - if (rootObject) { - QObjectList list = rootObject->children(); - QObject* item; - foreach (item,list) { - if (item->children().count()>0) { - findMissiles(item); - } else { - if (rootObject->objectName()=="missile") { - QDeclarativeItem* missile = static_cast<QDeclarativeItem*>(rootObject); - m_missileList.append(missile); - } else if (rootObject->objectName()=="enemy_missile") { - QDeclarativeItem* enemyMissile = static_cast<QDeclarativeItem*>(rootObject); - m_enemyMissileList.append(enemyMissile); - } - } - } - } else { - qDebug() << "GameEngine::findMissiles() rootObject NULL"; - } -} - -void GameEngine::findEnemies(QObject *rootObject) -{ - if (rootObject) { - QObjectList list = rootObject->children(); - QObject* item; - foreach (item,list) { - if (item->children().count()>0 && item->objectName()!="enemy") { - //qDebug() << "Enemy children found from: " << item->objectName(); - findEnemies(item); - } else { - if (item->objectName()=="enemy") { - //qDebug() << "Enemy child founds: " << item->objectName(); - QDeclarativeItem* enemy = static_cast<QDeclarativeItem*>(item); - m_enemyList.append(enemy); - } - } - } - } else { - qDebug() << "GameEngine::findEnemies() rootObject NULL"; - } -} - -void GameEngine::setEnemiesGridQml(QObject* o) -{ - m_enemiesGridGml = static_cast<QDeclarativeItem*>(o); -} - -void GameEngine::setMyShipQml(QObject* o) -{ - m_myShipGml = static_cast<QDeclarativeItem*>(o); -} - -void GameEngine::setGameQml(QObject* o) -{ - m_GameGml = static_cast<QDeclarativeItem*>(o); -} - - -void GameEngine::timerEvent(QTimerEvent *e) -{ - if (e->timerId()==m_timerId) { - // Do hit test - doHitTest(); - - m_doEnemyMissile--; - - if (m_gameLevel && m_doEnemyMissile<0) { - m_doEnemyMissile = m_gameLevel->enemyFireSpeed().toInt() / TIMER_SPEED; - // Do emeny missile launch - doEnemyMissile(); - } - } -} - -void GameEngine::enableEngineTimer(QVariant enable) -{ - if (m_gameLevel) { - if (m_timerId==0 && enable.toBool()) { - m_timerId = QObject::startTimer(TIMER_SPEED); - } - else if (m_timerId != 0 && !enable.toBool()) { - QObject::killTimer(m_timerId); - m_timerId = 0; - } - } -} - -void GameEngine::selectVisibleEnemy(int& start, int& end) -{ - QDeclarativeItem* enemy = 0; - for (int i=0 ; i<m_enemyList.count() ; i++) { - enemy = m_enemyList[i]; - if (enemy->opacity()==1) { - start = i; - break; - } - } - enemy = 0; - for (int e=m_enemyList.count()-1 ; e>0 ; e--) { - enemy = m_enemyList[e]; - if (enemy->opacity()==1) { - end = e; - break; - } - } -} - -void GameEngine::doEnemyMissile() -{ - QMutexLocker locker(&m_enemyListMutex); - - QDeclarativeItem* missile = 0; - QDeclarativeItem* enemy = 0; - - // Find free missile - foreach (missile, m_enemyMissileList) { - if (missile->opacity()==0){ - // Random select enemy who fire - int start=0; int end=0; - selectVisibleEnemy(start,end); - int whoWillFire = randInt(QVariant(start),QVariant(end)).toInt(); - if (m_enemyList.count() < whoWillFire+1) - break; - - enemy = m_enemyList.at(whoWillFire); - if (enemy && enemy->opacity()==1) { - QPointF enemyP = enemy->pos(); - if (m_enemiesGridGml) { - enemyP += m_enemiesGridGml->pos(); - } - //qDebug() << "QMetaObject::invokeMethod() - fireEnemyMissile"; - QMetaObject::invokeMethod(m_GameGml, "fireEnemyMissile", Qt::AutoConnection, - Q_ARG(QVariant, enemyP.x()+enemy->boundingRect().width()/4), - Q_ARG(QVariant, enemyP.y()+enemy->boundingRect().height()), - Q_ARG(QVariant, m_GameGml->boundingRect().height())); - } - break; - } - } -} - -void GameEngine::doHitTest() -{ - QMutexLocker locker(&m_enemyListMutex); - - QDeclarativeItem* missile = 0; - QDeclarativeItem* enemy = 0; - - // No enemies? - if (m_enemyList.count()==0) { - enableEngineTimer(QVariant(false)); - qDebug() << "No enemies left"; - gameOver(true); - return; - } - - if (!m_myShipGml) { - return; - } - - // Check ship collision - if (m_myShipGml->opacity()==1) { - for (int e=0; e<m_enemyList.count(); e++) { - enemy = m_enemyList[e]; - if (enemy->opacity()==0) { - break; - } - QPointF enemyP = enemy->pos(); - if (m_enemiesGridGml) { - enemyP += m_enemiesGridGml->pos(); - } - QRectF enemyR(enemyP,QSize(enemy->boundingRect().width(),enemy->boundingRect().height())); - // Collision? - if (enemyR.contains(m_myShipGml->pos())) { - enableEngineTimer(QVariant(false)); - - // Collision explosion - QPointF myP = m_myShipGml->pos(); - playSound(1); - QMetaObject::invokeMethod(m_levelQml, "explode", Qt::AutoConnection, - Q_ARG(QVariant, myP.x()+m_myShipGml->boundingRect().width()/2), - Q_ARG(QVariant, myP.y()+m_myShipGml->boundingRect().height())); - m_myShipGml->setOpacity(0); - - gameOver(false); - qDebug() << "Collision"; - return; - } - // Enemy too deep? - else if (enemyR.bottomLeft().y() > m_myShipGml->pos().y()+m_myShipGml->pos().y()*0.1) { - enableEngineTimer(QVariant(false)); - - // Enemy too deep explosion - QPointF myP = m_myShipGml->pos(); - playSound(1); - QMetaObject::invokeMethod(m_levelQml, "explode", Qt::AutoConnection, - Q_ARG(QVariant, myP.x()+m_myShipGml->boundingRect().width()/2), - Q_ARG(QVariant, myP.y()+m_myShipGml->boundingRect().height())); - m_myShipGml->setOpacity(0); - - gameOver(false); - qDebug() << "Enemy too deep"; - return; - } - } - } - - // Check your missiles hit to enemies - foreach (missile, m_missileList) { - if (missile->opacity()==1){ - for (int e=0; e<m_enemyList.count(); e++) { - enemy = m_enemyList[e]; - if (enemy->opacity()<1) { - break; - } - QPointF missileP = missile->pos(); - missileP.setX(missileP.rx() + missile->boundingRect().width()/2); - - QPointF enemyP = enemy->pos(); - if (m_enemiesGridGml) { - enemyP += m_enemiesGridGml->pos(); - } - - QRectF r(enemyP,QSize(enemy->boundingRect().width(),enemy->boundingRect().height())); - if (r.contains(missileP)) { - // Hit ! - playSound(0); - //qDebug() << "QMetaObject::invokeMethod() - explode"; - QMetaObject::invokeMethod(m_levelQml, "explode", Qt::AutoConnection, - Q_ARG(QVariant, enemyP.x()+enemy->boundingRect().width()/2), - Q_ARG(QVariant, enemyP.y()+enemy->boundingRect().height())); - missile->setOpacity(0); - //fastVibra(); - if (m_enemiesGridGml) { - // Set transparent placeholder for enemy when using GridView - enemy->setProperty("source",QVariant("file:/"+m_gameLevel->pathToTransparentEnemyPic().toString())); - } else { - // Hide enemy after explode - enemy->setOpacity(0); - } - - // Remove enemy from list - m_enemyList.removeAt(e); - e--; - } - enemy = 0; - } - } - } - - // Check enemies missiles hit to you - if (m_myShipGml->opacity()==1) { - foreach (missile, m_enemyMissileList) { - if (missile->opacity()==1){ - QPointF missileP = missile->pos(); - missileP.setX(missileP.rx() + missile->boundingRect().width()/2); - - QPointF myP = m_myShipGml->pos(); - - QRectF r(myP,QSize(m_myShipGml->boundingRect().width(),m_myShipGml->boundingRect().height())); - if (r.contains(missileP)) { - // Hit ! - playSound(1); - //qDebug() << "QMetaObject::invokeMethod() - explode"; - QMetaObject::invokeMethod(m_levelQml, "explode", Qt::AutoConnection, - Q_ARG(QVariant, myP.x()+m_myShipGml->boundingRect().width()/2), - Q_ARG(QVariant, myP.y()+m_myShipGml->boundingRect().height())); - missile->setOpacity(0); - m_myShipGml->setOpacity(0); - break; - } - } - } - } else { - // You was killed - enableEngineTimer(QVariant(false)); - gameOver(false); - qDebug() << "You was killed by enemy missile"; - } - -} - - -void GameEngine::playSound(QVariant index) -{ - if (!m_silent) { - int i = index.toInt(); - m_soundEngine->playSound(i); - } -} - -void GameEngine::playSounds(QVariant index, QVariant count) -{ - if (!m_silent) { - m_soundEngine->playSounds(index.toInt(),count.toInt()); - } -} - -void GameEngine::playInternalSound(QVariant index) -{ - if (!m_silent) { - m_soundEngine->playInternalSound(index.toInt()); - } -} - -void GameEngine::playInternalSounds(QVariant index, QVariant count) -{ - if (!m_silent) { - m_soundEngine->playInternalSounds(index.toInt(),count.toInt()); - } -} - -void GameEngine::gameOver(bool youWin) -{ - qDebug() << "GameEngine::gameOver() "<< youWin; - QMetaObject::invokeMethod(m_GameGml, "gameOver", Qt::AutoConnection,Q_ARG(QVariant, youWin)); -} - -void GameEngine::pauseGame() { - QMetaObject::invokeMethod(m_GameGml, "pauseGame", Qt::AutoConnection); -} - - -QVariant GameEngine::isSymbian() -{ -#ifdef Q_OS_SYMBIAN - return QVariant(true); -#else - return QVariant(false); -#endif -} - -QVariant GameEngine::isMaemo() -{ -#ifdef Q_WS_MAEMO_5 - return QVariant(true); -#else - return QVariant(false); -#endif -} - -QVariant GameEngine::isWindows() -{ -#ifdef Q_OS_WIN - return QVariant(true); -#else - return QVariant(false); -#endif -} - -void GameEngine::vibra() -{ -#ifdef Q_OS_SYMBIAN - if (iVibrate){ - TRAPD(err, iVibrate->StartVibraL(4000,KHWRMVibraMaxIntensity)); - } -#endif -} - -void GameEngine::fastVibra() -{ -#ifdef Q_OS_SYMBIAN - if (iVibrate){ - TRAPD(err, iVibrate->StartVibraL(100,KHWRMVibraMaxIntensity)); - } -#endif -} - -void GameEngine::openLink(QVariant link) -{ -QDesktopServices::openUrl(QUrl(link.toString())); -} - |