X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=seascene.cpp;h=6e1b10f57b94971031322f6403f51087dffb2a66;hb=79c4398587d92131abb769f654513eb16916c0e6;hp=81e4acef37b48206ad51c336808b595a770a2f3c;hpb=2d3760ee6924d23b1fc428ea57547aeaed98e4d3;p=ghostsoverboard diff --git a/seascene.cpp b/seascene.cpp index 81e4ace..6e1b10f 100644 --- a/seascene.cpp +++ b/seascene.cpp @@ -27,6 +27,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include const QString ghostImageFilename_ = ":/pix/aave.png"; const QString rockImageFilename_ =":/pix/kari.png"; @@ -36,6 +43,9 @@ const QString octopusImageFilename_= ":/pix/tursas.png"; SeaScene::SeaScene(QObject *parent) : QGraphicsScene(parent) { + + setItemPointersNull(); + paused_ = false; screenLitKeeper_.keepScreenLit(true); @@ -49,16 +59,40 @@ SeaScene::SeaScene(QObject *parent) : qsrand(QTime::currentTime().msec()+2); //+2 to avoid setting it to 1 - //connect selecting to menu handling (only menu items selectable) +//Setup the level list + + Level level1(5,10); + levelList_.append(level1); + Level level2(5,10,2,50); + levelList_.append(level2); + Level level3(5,15,2,50); + levelList_.append(level3); + Level level4(5,15,4,50); + levelList_.append(level4); + Level level5(5,15,5,100); + levelList_.append(level5); + + currentLevel_ = 0; - connect(this,SIGNAL(selectionChanged()),this,SLOT(menuClicked())); + 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))); + autopauseTimer.setSingleShot(true); + autopauseTimer.setInterval(15*60*1000); + connect(&autopauseTimer,SIGNAL(timeout()),this,SLOT(forcePause())); } @@ -69,8 +103,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(); @@ -187,6 +228,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) @@ -314,24 +357,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 } } @@ -340,90 +388,322 @@ void SeaScene::vibrationActivate(bool on) emit vibrationActivated(on); } -void SeaScene::menuClicked() +void SeaScene::handleScreenTapped() { + + //If the game is going just pause it + if (!paused_) + { + pPauseAction_->setChecked(true); + return; + } + + //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(); - //if nothing selected (selection was removed) do nothing + //if nothing selected resume play if (items.isEmpty()) + { + pPauseAction_->setChecked(false); return; - //Tapping the screen unpaused the game, pause it again! - + } + //If something was selected check if it was one of the menu items and act on it + //(Nothing else should be made selectable anyway) //Menu functions - QGraphicsItem* pItem = items.at(0); + 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 == pVibrateItem_) + else if (pItem == pSettingsItem_) { + pVibrateAction_->toggle(); + + QSettings settings; + settings.setValue("vibration",pVibrateAction_->isChecked()); + 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_) { + about(); + } + + else if(pItem == pMinimizeItem_) + { + emit minimizeRequested(); + } + else if (pItem == pQuitItem_) + { + qApp->quit(); } +} - //Selection is just used to get notice of being clicked, removed after use - clearSelection(); +void SeaScene::createMenuItems() +{ + + QFont font; + font.setPixelSize(35); + + + + pPausetextItem_ = new QGraphicsTextItem; + pPausetextItem_->setHtml(" Game paused. Tap to continue."); + pPausetextItem_->setZValue(1000); + pPausetextItem_->setPos(165,50); + addItem(pPausetextItem_); + pPausetextItem_->hide(); + + menuItemCount_ = 0; + + QString menufonthtml = ""; + + pRestartGameItem_ = new QGraphicsTextItem; + pRestartGameItem_->setHtml(tr("Restart
game").prepend(menufonthtml)); + prepareForMenu(pRestartGameItem_); + + pRestartLevelItem_ = new QGraphicsTextItem; + pRestartLevelItem_->setHtml(tr("Restart
level").prepend(menufonthtml)); + prepareForMenu(pRestartLevelItem_); + + pSettingsItem_ = new QGraphicsTextItem; + 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_); } -void SeaScene::showMenu() +void SeaScene::prepareForMenu(QGraphicsItem * pItem) +{ + + //Menu items have pause text item as their parent and are thus added to scene automatically + //They are also shown and hidden with it, resulting in the menu being visble when the game is paused + //Their coordinates are given relative to the parent. + + + + + int itemsPerRow = 3; + + pItem->setParentItem(pPausetextItem_); + pItem->setZValue(1000); + pItem->setFlag(QGraphicsItem::ItemIsSelectable); + + int row = menuItemCount_/(itemsPerRow); + pItem->setY(150+row*120); + pItem->setX(((menuItemCount_%(itemsPerRow))*180+5)); + + menuItemCount_++; + } + + +void SeaScene::about() { - menuItems_.show(); + pPausetextItem_->hide(); + pAboutBoxItem_->show(); } -void::SeaScene::hideMenu() + +void SeaScene::restartLevel() { - menuItems_.hide(); + 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 } -void SeaScene::createMenuItems() + + +void SeaScene::nextLevel() { - pPausetextItem_ = addSimpleText("Game paused. Tap to continue."); - pPausetextItem_->setZValue(1000); + currentLevel_++; - //Menu items have pause text item as their parent and are thus added to scene automatically - //They are also shown and hidden with it, resulting in the menu being visble when the game is paused + if (levelList_.empty()) + setupMap(Level()); + + + if ( currentLevel_ < levelList_.size() ) + { + restartLevel(); + } + + else //Victory! + { + + pPauseAction_->setChecked(true); //Pause the game while showing the victory dialog + + pPausetextItem_->hide(); + + pVictoryCongratulationsItem_->show(); + + } +} - pRestartGameItem_ = new QGraphicsSimpleTextItem("Restart game",pPausetextItem_); - pRestartGameItem_->setPos(0,200); - pRestartGameItem_->setZValue(1000); - pRestartGameItem_->setFlag(QGraphicsItem::ItemIsSelectable); - pRestartLevelItem_ = new QGraphicsSimpleTextItem("Restart level",pPausetextItem_); - pRestartLevelItem_->setPos(150,200); - pRestartLevelItem_->setZValue(1000); - pRestartLevelItem_->setFlag(QGraphicsItem::ItemIsSelectable); +void SeaScene::restartGame() +{ + currentLevel_ = 0; + restartLevel(); +} + + +void SeaScene::forcePause() +{ + //Pause without setting the pause action state + pause(true); +} + +void SeaScene::softContinue() +{ + //Continue if not being paused by the user + // Reverts forcePause() - QGraphicsRectItem * item = new QGraphicsRectItem(100,100,50,50,pPausetextItem_); - item->setFlag(QGraphicsItem::ItemIsSelectable); - QBrush brush; - brush.setStyle(Qt::SolidPattern); - item->setBrush(brush); + 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; }