X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=seascene.cpp;h=b29c068b555bc7655e2562baa7d23a0d05aa5247;hb=65329e998b27b5ccacd2d39c29a4d6b2fa8f2844;hp=c90636f77600cea5e94274527b763935c913cb74;hpb=932e7d903101303bb95db1fc206566a5a64c6258;p=ghostsoverboard diff --git a/seascene.cpp b/seascene.cpp index c90636f..b29c068 100644 --- a/seascene.cpp +++ b/seascene.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include const QString ghostImageFilename_ = ":/pix/aave.png"; const QString rockImageFilename_ =":/pix/kari.png"; @@ -41,6 +43,9 @@ const QString octopusImageFilename_= ":/pix/tursas.png"; SeaScene::SeaScene(QObject *parent) : QGraphicsScene(parent) { + + setItemPointersNull(); + paused_ = false; screenLitKeeper_.keepScreenLit(true); @@ -69,18 +74,28 @@ SeaScene::SeaScene(QObject *parent) : currentLevel_ = 0; + connect(this,SIGNAL(allGhostsPicked()),this,SLOT(nextLevel())); pVibrateAction_ = new QAction(tr("Vibration effects"),this); pVibrateAction_->setCheckable(true); connect(pVibrateAction_,SIGNAL(toggled(bool)),this,SLOT(vibrationActivate(bool))); + QSettings settings; + pVibrateAction_->setChecked(settings.value("vibration",false).toBool()); pPauseAction_ = new QAction(tr("Pause"),this); pPauseAction_->setCheckable(true); connect(pPauseAction_,SIGNAL(toggled(bool)),this,SLOT(pause(bool))); + connect(&deviceInfo_,SIGNAL(lockStatusChanged(bool)),this,SLOT(handleDeviceLocked(bool))); + + + autopauseTimer.setSingleShot(true); + autopauseTimer.setInterval(15*60*1000); + connect(&autopauseTimer,SIGNAL(timeout()),this,SLOT(turnPauseOn())); + } @@ -90,8 +105,15 @@ void SeaScene::setupMap(int ghosts, int rocks, int octopuses, int octopusSpeed) clear(); + setItemPointersNull(); + createMenuItems(); + createAboutBoxItems(); + + createVictoryItems(); + + //empty the list of moving items movingItems_.clear(); @@ -208,6 +230,8 @@ void SeaScene::setupMap(int ghosts, int rocks, int octopuses, int octopusSpeed) connect(pOctopus,SIGNAL(droppingGhosts()),pShip,SLOT(dropAllGhosts())); } delete pPosition; + + } void SeaScene::setupMap(Level level) @@ -335,24 +359,29 @@ void SeaScene::pause(bool paused) if (paused == false) { // qDebug() << "starting to move again"; + emit fullscreenRequested(); emit pauseOff(); screenLitKeeper_.keepScreenLit(true); if (pPausetextItem_) pPausetextItem_->hide(); + + autopauseTimer.start(); //Start counting towards autopause } else { - qDebug("about to stop movement"); +// qDebug("about to stop movement"); emit pauseOn(); screenLitKeeper_.keepScreenLit(false); if (pPausetextItem_ != NULL) { - qDebug() << "about to show the pause text"; +// qDebug() << "about to show the pause text"; pPausetextItem_->show(); - qDebug() << "showing pause text"; +// qDebug() << "showing pause text"; } - else qDebug() << "No pause text available"; +// else qDebug() << "No pause text available"; + + autopauseTimer.stop(); //No need to count toward autopause when already paused } } @@ -371,7 +400,31 @@ void SeaScene::handleScreenTapped() return; } - //If the game is paused, chacl if menu item was selected + //If the game is paused and about box is shown, close it and show the pause text and menu again + + if(pAboutBoxItem_) + { + if(pAboutBoxItem_->isVisible()) + { + pAboutBoxItem_->hide(); + pPausetextItem_->show(); + } + } + + + //If the game is paused, check if the victory item is being shown + if(pVictoryCongratulationsItem_) + { + if (pVictoryCongratulationsItem_->isVisibleTo(NULL)) //returns visibility to scene + { + pVictoryCongratulationsItem_->hide(); + restartGame(); + pPauseAction_->setChecked(false); // unpause + return; + } + } + + //If the game is paused and no victory, check if menu item was selected QList items = selectedItems(); @@ -392,30 +445,43 @@ void SeaScene::handleScreenTapped() QGraphicsItem* pItem = items.at(0); //Selecting an item brings here, thus only selecting one item should be possible //... so we can just take the first one + //Selection is just used to get notice of a menu item being clicked, removed after use + + clearSelection(); + + + //Act upon the selected item + if (pItem == pRestartGameItem_) { - qDebug() << "game restart requested"; +// qDebug() << "game restart requested"; restartGame(); + pPauseAction_->setChecked(false); //unpause game + } else if (pItem == pRestartLevelItem_) { - qDebug() << "Level restart requested"; +// qDebug() << "Level restart requested"; restartLevel(); + pPauseAction_->setChecked(false); //unpause game } else if (pItem == pSettingsItem_) { - //Temporary code for settings, likely to be turned into a QML dialog + pVibrateAction_->toggle(); - QMessageBox::StandardButton buttonpressed = QMessageBox::question(NULL,"Settings","Do you wish to have vibration effects enabled?", QMessageBox::Yes | QMessageBox::No); + QSettings settings; + settings.setValue("vibration",pVibrateAction_->isChecked()); - if (buttonpressed == QMessageBox::Yes) - pVibrateAction_->setChecked(true); - if (buttonpressed == QMessageBox::No) - pVibrateAction_->setChecked(false); + QString text = pSettingsItem_->toHtml(); + if (pVibrateAction_->isChecked()) + text.replace(" on"," off"); //don't remove spaces or you get vibratioff... + else + text.replace(" off"," on"); + pSettingsItem_->setHtml(text); } else if (pItem == pAboutItem_) @@ -423,20 +489,15 @@ void SeaScene::handleScreenTapped() about(); } + else if(pItem == pMinimizeItem_) + { + emit minimizeRequested(); + } + else if (pItem == pQuitItem_) { qApp->quit(); } - - - //Selection is just used to get notice of a menu item being clicked, removed after use - - clearSelection(); - - //The user propably went to paused state just to access menu, so unpause - - pPauseAction_->setChecked(false); - } @@ -452,7 +513,7 @@ void SeaScene::createMenuItems() pPausetextItem_ = new QGraphicsTextItem; pPausetextItem_->setHtml(" Game paused. Tap to continue."); pPausetextItem_->setZValue(1000); - pPausetextItem_->setPos(200,50); + pPausetextItem_->setPos(165,50); addItem(pPausetextItem_); pPausetextItem_->hide(); @@ -469,13 +530,28 @@ void SeaScene::createMenuItems() prepareForMenu(pRestartLevelItem_); pSettingsItem_ = new QGraphicsTextItem; - pSettingsItem_->setHtml(tr("Settings").prepend(menufonthtml)); + QString vibraText(tr("Turn vibration
effects ")); + QString statusText; + if (pVibrateAction_->isChecked()) + { + statusText = "off"; + } + else + { + statusText = "on"; + } + vibraText.append(statusText); + pSettingsItem_->setHtml(vibraText.prepend(menufonthtml)); prepareForMenu(pSettingsItem_); pAboutItem_ = new QGraphicsTextItem; pAboutItem_->setHtml(tr("About
game").prepend(menufonthtml)); prepareForMenu(pAboutItem_); + pMinimizeItem_ = new QGraphicsTextItem; + pMinimizeItem_->setHtml(tr("Show
status bar").prepend(menufonthtml)); + prepareForMenu(pMinimizeItem_); + pQuitItem_ = new QGraphicsTextItem; pQuitItem_->setHtml(tr("Quit
game").prepend(menufonthtml)); prepareForMenu(pQuitItem_); @@ -490,26 +566,26 @@ void SeaScene::prepareForMenu(QGraphicsItem * pItem) //Their coordinates are given relative to the parent. + + + int itemsPerRow = 3; + pItem->setParentItem(pPausetextItem_); pItem->setZValue(1000); pItem->setFlag(QGraphicsItem::ItemIsSelectable); - pItem->setY(150); - pItem->setX(menuItemCount_++*160-150); + + int row = menuItemCount_/(itemsPerRow); + pItem->setY(150+row*120); + pItem->setX(((menuItemCount_%(itemsPerRow))*180+5)); + + menuItemCount_++; } void SeaScene::about() { - QMessageBox::about(NULL, tr("About %1").arg(QApplication::applicationName()), - tr("Version %1" - "

Copyright 2011 Heli Hyvättinen" - "

License: General Public License v2" - "

Bug Reports: https://bugs.maemo.org/ " - "enter_bug.cgi?product=Ghosts%20Overboard" - ).arg(QApplication::applicationVersion())); - - - + pPausetextItem_->hide(); + pAboutBoxItem_->show(); } @@ -518,6 +594,7 @@ void SeaScene::restartLevel() setupMap(levelList_.value(currentLevel_)); //value() returns default constructor Level if index is invalid, so no risk of crash vibrationActivate(pVibrateAction_->isChecked()); //Vibration effects are lost without this // qDebug() << pVibrateAction_->isChecked(); + autopauseTimer.start(); //reset counting towards autopause } @@ -539,47 +616,12 @@ void SeaScene::nextLevel() else //Victory! { - QDialog* pVictoryDialog = new QDialog(); - pVictoryDialog->setWindowTitle(tr("You won!")); - - - QPushButton* pPlayAgainButton = new QPushButton(tr("Play again")); -// QPushButton* pQuitButton = new QPushButton(tr("Quit game")); - - QPixmap victoryIcon (":/pix/aavesaari.png"); - QLabel* pVictoryLabel = new QLabel(); - pVictoryLabel->setPixmap(victoryIcon); - - QLabel* pTextLabel = new QLabel(tr("Congratulations!

You have saved all the ghosts.")); - - - QVBoxLayout* pMainLayout = new QVBoxLayout; - - QHBoxLayout* pTopLayout = new QHBoxLayout; - pMainLayout->addLayout(pTopLayout); - - pTopLayout->addWidget(pVictoryLabel); - pTopLayout->addWidget(pTextLabel); - - - - QHBoxLayout* pButtonLayout = new QHBoxLayout(); - pMainLayout->addLayout(pButtonLayout); - - // pButtonLayout->addWidget(pQuitButton); - pButtonLayout->addWidget(pPlayAgainButton); - - - - pVictoryDialog->setLayout(pMainLayout); + pPauseAction_->setChecked(true); //Pause the game while showing the victory dialog - connect(pPlayAgainButton, SIGNAL(clicked()),pVictoryDialog,SLOT(accept())); + pPausetextItem_->hide(); - pVictoryDialog->exec(); + pVictoryCongratulationsItem_->show(); - //Never mind if the user cancels the dialog: restart the game anyway - - restartGame(); } } @@ -597,10 +639,87 @@ void SeaScene::forcePause() pause(true); } -void::SeaScene::softContinue() +void SeaScene::softContinue() { //Continue if not being paused by the user // Reverts forcePause() pause(pPauseAction_->isChecked()); } + + +void SeaScene::createVictoryItems() +{ + pVictoryCongratulationsItem_ = new QGraphicsTextItem; + pVictoryCongratulationsItem_->setHtml(" Victory!"); + pVictoryCongratulationsItem_->hide(); + pVictoryCongratulationsItem_->setPos(355,50); + pVictoryCongratulationsItem_->setZValue(1000); + addItem(pVictoryCongratulationsItem_); + + + //coordinates are relative to the parent + + QGraphicsTextItem * pTextItem = new QGraphicsTextItem(pVictoryCongratulationsItem_); + pTextItem->setHtml(" Congratulations!"); + pTextItem->setPos(-50,100); + pTextItem->setZValue(1000); + + QGraphicsTextItem * pMiddleTextItem = new QGraphicsTextItem(pVictoryCongratulationsItem_); + pMiddleTextItem->setHtml(" You have saved all the ghosts."); + pMiddleTextItem->setPos(-145,140); + pMiddleTextItem->setZValue(1000); + + QGraphicsTextItem * pLowestTextItem = new QGraphicsTextItem(pVictoryCongratulationsItem_); + pLowestTextItem->setHtml(" Tap to play again"); + pLowestTextItem->setPos(-50,220); + pLowestTextItem->setZValue(1000); +} + +void SeaScene::createAboutBoxItems() +{ + pAboutBoxItem_ = new QGraphicsTextItem; + addItem(pAboutBoxItem_); + pAboutBoxItem_->setPos(25,50); + pAboutBoxItem_->setZValue(1000); + pAboutBoxItem_->hide(); + + pAboutBoxItem_->setHtml(tr("" + "%1
Version %2" + "

Copyright 2011 Heli Hyvättinen" + "

License: General Public License v2" + "

Web: http://ghostsoverboard.garage.maemo.org/
" + "Bug Reports:
https://bugs.maemo.org/" + "enter_bug.cgi?product=Ghosts%20Overboard" + ).arg(QApplication::applicationName(),QApplication::applicationVersion())); + +} + +void SeaScene::setItemPointersNull() +{ + pPausetextItem_ = NULL; + pRestartLevelItem_ = NULL; + pRestartGameItem_ = NULL; + pSettingsItem_ = NULL; + pAboutItem_ = NULL; + pQuitItem_ = NULL ; + pMinimizeItem_ = NULL; + + pAboutBoxItem_ = NULL; + pVictoryCongratulationsItem_ = NULL; + +} + +void SeaScene::turnPauseOn() +{ + pPauseAction_->setChecked(true); +} + +void SeaScene::handleDeviceLocked(bool isLocked) +{ + //pauses if locked but does not unpause if unlocked + if(isLocked) + { + pPauseAction_->setChecked(true); + } +}