Keeps screen lit and pauses when app is backgrounded
[ghostsoverboard] / seascene.cpp
index 3183161..4c2e72c 100644 (file)
@@ -4,6 +4,7 @@
 #include <QGraphicsPixmapItem>
 #include <QDebug>
 #include <QMessageBox>
+#include <QTime>
 
 const QString ghostImageFilename_ = ":/pix/aave.png";
 const QString rockImageFilename_ =":/pix/kari.png";
@@ -13,6 +14,19 @@ const QString octopusImageFilename_= ":/pix/tursas.png";
 SeaScene::SeaScene(QObject *parent) :
     QGraphicsScene(parent)
 {
+    paused_ = false;
+    screenLitKeeper_.keepScreenLit(true);
+
+    //set background
+
+    QPixmap waves (":/pix/meri.png");
+    waves.scaled(20,20);
+    setBackgroundBrush(QBrush(waves));
+
+    //set random seed
+
+    qsrand(QTime::currentTime().msec()+2);  //+2 to avoid setting it to 1
+
 
 
 }
@@ -23,6 +37,10 @@ void SeaScene::setupMap(int ghosts, int rocks, int octopuses)
 
     clear();
 
+    //empty the list of moving items
+
+    movingItems_.clear();
+
     //empty the list of free slots
     freeTiles_.clear();
 
@@ -49,6 +67,8 @@ void SeaScene::setupMap(int ghosts, int rocks, int octopuses)
     {
         QPointF * pPosition = findRandomFreeSlot();
 
+        qDebug() << "Found a place for a rock";
+
         //If there was no room no point to continue
         if (pPosition == NULL)
             break;
@@ -85,6 +105,9 @@ void SeaScene::setupMap(int ghosts, int rocks, int octopuses)
     pOctopus->setPos(*pPosition);
     addItem(pOctopus);
     pOctopus->startMoving();
+    movingItems_.append(pOctopus);
+    connect(this,SIGNAL(pauseOn()),pOctopus,SLOT(stopMoving()));
+    connect(this,SIGNAL(pauseOff()),pOctopus,SLOT(startMoving()));
     delete pPosition;
 
     }
@@ -101,19 +124,88 @@ void SeaScene::setupMap(int ghosts, int rocks, int octopuses)
         return;
     }
 
-    Ship * pShip = new Ship (QPixmap(":/pix/laiva.png"));
+    QList<QPixmap> shipImages;
+    shipImages.append(QPixmap(":/pix/laiva.png"));
+    shipImages.append(QPixmap(":/pix/laiva_1aave.png"));
+    shipImages.append(QPixmap(":/pix/laiva_2aave.png"));
+    shipImages.append(QPixmap(":/pix/laiva_3aave.png"));
+    shipImages.append(QPixmap(":/pix/laiva_4aave.png"));
+    shipImages.append(QPixmap(":/pix/laiva_5aave.png"));
+    shipImages.append(QPixmap(":/pix/laiva_6aave.png"));
+    shipImages.append(QPixmap(":/pix/laiva_7aave.png"));
+    shipImages.append(QPixmap(":/pix/laiva_8aave.png"));
+    shipImages.append(QPixmap(":/pix/laiva_9aave.png"));
+    shipImages.append(QPixmap(":/pix/laiva_10aave.png"));
+
+    Ship * pShip = new Ship (shipImages);
     pShip->setData(0,"ship");
     pShip->setPos(*pPosition);
     addItem(pShip);
     connect(pShip,SIGNAL(pickingGhost(QGraphicsItem*)),this, SLOT(removeGhost(QGraphicsItem*)) );
     connect(pShip,SIGNAL(droppingGhosts(int)),this,SLOT(ghostsDropped(int)));
     pShip->startMoving();
+    movingItems_.append(pShip);
+    connect(this,SIGNAL(pauseOn()),pShip,SLOT(stopMoving()));
+    connect(this,SIGNAL(pauseOff()),pShip,SLOT(startMoving()));
     delete pPosition;
 }
 
 
 void SeaScene::spreadGhosts(int ghosts)
 {
+
+
+    //the octopuses and the ship may have moved from their original positions,
+    //so the list of free slots must be adjusted to exclude their current positions
+
+    QList<QPointF> temporarilyReservedSlots;
+
+    foreach (QGraphicsItem* pItem, movingItems_)
+    {
+        if (pItem == NULL)
+        {
+ //           qDebug() << "NULL item in movingItems_";
+            continue;
+        }
+
+        //round x and y down to fit the slot size
+        int x = pItem->x();
+        x = x/40;
+        x = x*40;
+
+        int y = pItem->y();
+        y = y/40;
+        y=y*40;
+
+
+        QPointF position (x,y);
+
+        //remove the tiles (potentially) occupied by the item from free slots and place in temp list if was in the list before
+
+        if (freeTiles_.removeOne(position))
+            temporarilyReservedSlots.append(position);
+
+
+        position.setX(x+40);
+
+        if (freeTiles_.removeOne(position))
+            temporarilyReservedSlots.append(position);
+
+        position.setY(y+40);
+
+        if (freeTiles_.removeOne(position))
+            temporarilyReservedSlots.append(position);
+
+        position.setX(x);
+
+        if (freeTiles_.removeOne(position))
+            temporarilyReservedSlots.append(position);
+
+    }
+
+
+    //spread ghosts in random free slots
+
     for (int i=0; i < ghosts; i++)
     {
         QPointF * pPosition = findRandomFreeSlot();
@@ -128,6 +220,12 @@ void SeaScene::spreadGhosts(int ghosts)
         pGhost->setPos(*pPosition);
         delete pPosition;
     }
+
+    //return the slots occupied by moving items to free slots
+    freeTiles_.append(temporarilyReservedSlots);
+
+    //clear temp for the next round
+    temporarilyReservedSlots.clear();
 }
 
 QPointF* SeaScene::findRandomFreeSlot()
@@ -150,7 +248,7 @@ void SeaScene::removeGhost(QGraphicsItem *pGhost)
     ghostsLeft_--;
     if (ghostsLeft_ == 0)
     {
-        //here whatever happens when a level is complete / a signal
+        emit allGhostsPicked();
         qDebug() << "All ghosts picked!";
     }
 }
@@ -161,3 +259,26 @@ void SeaScene::ghostsDropped(int ghosts)
 
     spreadGhosts(ghosts);
 }
+
+void SeaScene::pause(bool paused)
+{
+    //    qDebug() << "pause pressed " << paused;
+        if (paused_ == paused)
+                return;
+
+        paused_ = paused;
+
+        if (paused == false)
+        {
+     //       qDebug() << "starting to move again";
+            emit pauseOff();
+            screenLitKeeper_.keepScreenLit(true);
+        }
+
+        else
+        {
+     //       qDebug("about to stop movement");
+            emit pauseOn();
+            screenLitKeeper_.keepScreenLit(false);
+        }
+}