connect(pRestartLevelAction,SIGNAL(triggered()),this,SLOT(restartLevel()));
menuBar()->addAction(pRestartLevelAction);
+ QAction * pVibrateAction = new QAction(tr("Vibration effects"),this);
+ pVibrateAction->setCheckable(true);
+ addAction(pVibrateAction);
+ connect(pVibrateAction,SIGNAL(triggered(bool)),pScene_,SLOT(vibrationActivate(bool)));
+ menuBar()->addAction(pVibrateAction);
+
QAction * pAboutAction = new QAction(tr("About"),this);
addAction(pAboutAction);
connect(pAboutAction,SIGNAL(triggered()),this,SLOT(about()));
menuBar()->addAction(pAboutAction);
+ QAction * pRestartGameAction = new QAction(tr("Restart game"),this);
+ addAction(pRestartGameAction);
+ connect(pRestartGameAction,SIGNAL(triggered()),this,SLOT(restartGame()));
+ menuBar()->addAction(pRestartGameAction);
+
+ Level level1(5,10);
+ levelList_.append(level1);
+ Level level2(5,10,2,50);
+ levelList_.append(level2);
+ Level level3(5,15,3,50);
+ levelList_.append(level3);
+ Level level4(5,15,5,50);
+ levelList_.append(level4);
+ Level level5(5,15,5,100);
+ levelList_.append(level5);
+
+ currentLevel_ = 0;
+
//the boundaries of the scene are set to match the size of the view window, which is not
//available in the constructor --> timer needed
QTimer::singleShot(100,this,SLOT(initializeBoundaries()));
void MainWindow::restartLevel()
{
- pScene_->setupMap(5,10,5);
+ pScene_->setupMap(levelList_.at(currentLevel_));
}
void MainWindow::about()
void MainWindow::nextLevel()
{
- //for now, just the handling of last level is implemented, and there is just one level
+ currentLevel_++;
+
+ if (levelList_.empty())
+ pScene_->setupMap(Level());
+ if ( currentLevel_ < levelList_.size() )
+ {
+ pScene_->setupMap(levelList_.at(currentLevel_));
+ }
+
+ else //Victory!
+ {
QDialog* pVictoryDialog = new QDialog(this);
pVictoryDialog->setWindowTitle(tr("You won!"));
//Never mind if the user cancels the dialog: restart the game anyway
- restartLevel();
-
+ restartGame();
+ }
}
bool MainWindow::event(QEvent *event)
}
+ void MainWindow::restartGame()
+ {
+ currentLevel_ = 0;
+ pScene_->setupMap(levelList_.value(currentLevel_)); //value() returns default constructor Level, so no need to check if list empty
+
+ }
}
- void SeaScene::setupMap(int ghosts, int rocks, int octopuses)
+ void SeaScene::setupMap(int ghosts, int rocks, int octopuses, int octopusSpeed)
{
//empty the map
break;
QPixmap octopusPixmap (":/pix/tursas.png");
- Octopus * pOctopus = new Octopus(octopusPixmap,100);
+ Octopus * pOctopus = new Octopus(octopusPixmap,octopusSpeed);
pOctopus->setData(0,"octopus");
pOctopus->setPos(*pPosition);
addItem(pOctopus);
addItem(pShip);
connect(pShip,SIGNAL(pickingGhost(QGraphicsItem*)),this, SLOT(removeGhost(QGraphicsItem*)) );
connect(pShip,SIGNAL(droppingGhosts(int)),this,SLOT(ghostsDropped(int)));
+ connect(this,SIGNAL(vibrationActivated(bool)),pShip,SLOT(setVibrationActivate(bool)));
pShip->startMoving();
movingItems_.append(pShip);
connect(this,SIGNAL(pauseOn()),pShip,SLOT(stopMoving()));
delete pPosition;
}
+ void SeaScene::setupMap(Level level)
+ {
+ setupMap(level.getNumberOfGhosts(),level.getNumberOfRocks(),level.getNumberOfOctopuses(),level.getOctopusSpeed());
+ }
void SeaScene::spreadGhosts(int ghosts)
{
screenLitKeeper_.keepScreenLit(false);
}
}
+
+void SeaScene::vibrationActivate(bool on)
+{
+ emit vibrationActivated(on);
+}
#include <QGraphicsScene>
#include "screenlitkeeper.h"
+ #include "level.h"
class SeaScene : public QGraphicsScene
{
void allGhostsPicked();
void pauseOn();
void pauseOff();
+ void vibrationActivated(bool on);
public slots:
@param rocks the number of rocks to be placed on the map
@param octopuses number of octopuses to be placed on the map
*/
- void setupMap(int ghosts, int rocks, int octopuses);
+ void setupMap(int ghosts, int rocks, int octopuses, int octopusSpeed);
+
+ void setupMap(Level level);
void spreadGhosts(int ghosts);
void pause (bool paused);
+ void vibrationActivate(bool);
+
protected:
/*! Gives a pointer to a random position if a free one is found. Otherwise returns NULL.