Basic game using accelerometer and LCD screen. You can move and dodge asteroids coming from both left and right. There is no scoring at the moment.

Dependencies:   C12832 FXOS8700Q mbed-rtos mbed

Revision:
1:c6734b909bf0
Parent:
0:9ec880239b3c
Child:
2:9e0c826103d7
--- a/Game.cpp	Mon Feb 15 18:18:16 2016 +0000
+++ b/Game.cpp	Tue Feb 16 22:25:42 2016 +0000
@@ -5,7 +5,9 @@
 #endif
 
 Game::Game()
-    : _thread(&Game::threader, this, osPriorityNormal,1024)
+    :   thread(&Game::threader, this, osPriorityNormal,1024),
+        mutex(),
+        boost(D4)
 {
 #if defined _DEBUG
     host.baud(38400);
@@ -13,22 +15,26 @@
     this->player = new Player();
     this->lcd = new C12832(D11, D13, D12, D7, D10);
     this->lcd->set_auto_up(0);
-
+    this->score = 0;
+    this->next = 0;
+    this->delta = 0;
     this->accel = new FXOS8700Q_acc(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1);
     this->accel->enable();
     this->accel->getY(&this->steadyPosition);
     this->asteroids = std::list<Asteroid*>();
-    this->_thread.signal_set(START_THREAD);
+    this->thread.signal_set(START_THREAD);
+    srand(time(NULL));
 }
 
 Game::~Game()
 {
+    this->thread.terminate();
     this->accel->disable();
-    this->_thread.terminate();
+    this->display();
     this->lcd->rect(this->player->getX() - 2, this->player->getY() - 2, this->player->getX() + 3, this->player->getY() + 3, 1);
+    this->lcd->locate(0, 0);
+    this->lcd->printf("GAME OVER\r\nScore: %d\r\n", this->score);
     this->lcd->copy_to_lcd();
-    this->lcd->locate(0, 0);
-    this->lcd->printf("GAME OVER");
     delete this->player;
     delete this->accel;
     delete this->lcd;
@@ -45,52 +51,66 @@
     while (this->player->isAlive()) {
         this->process();
         this->display();
+        ++this->score;
         Thread::wait(DELTA_TIME);
     }
 }
 
 void    Game::watchAccel()
 {
-    this->_thread.signal_wait(START_THREAD);
+    this->thread.signal_wait(START_THREAD);
     while (true) {
         int16_t raX, raY;
         this->accel->getX(&raX);
         this->accel->getY(&raY);
+        this->mutex.lock(100);
         this->player->move(-raX, raY - this->steadyPosition);
-        Thread::wait(DELTA_TIME);
+        this->mutex.unlock();
+        Thread::wait(this->boost ? DELTA_TIME / 2 : DELTA_TIME);
     }
 }
 
 void    Game::process()
 {
-    static int delta = 0;
-    static int next = rand() % 6;
-    if (delta >= next) {
+    this->factory();
+#if defined _DEBUG
+    host.printf("Currently %d Asteroid(s).\r\n", this->asteroids.size());
+#endif
+    this->move();
+}
+
+void    Game::factory()
+{
+    ++this->delta;
+#if defined _DEBUG
+    host.printf("=> [%c] next asteroid in %d/%d cycle(s).\r\n", this->delta >= this->next ? '1' : '0', this->delta, this->next);
+#endif
+    if (this->delta >= this->next && (MAX_ASTEROID_NBS != 0 ? this->asteroids.size() <= MAX_ASTEROID_NBS : true)) {
+#if defined _DEBUG
+        host.printf("\t***** GENERATION !!!! *****\r\n");
+#endif
         this->generate();
-        next = rand() % 6;
-        delta = 0;
-    }
-    ++delta;
-    
-    std::list<Asteroid*>::iterator it;
-    
-    for (it = this->asteroids.begin(); it != this->asteroids.end(); it++) {
-        if (!(*it)->move(this->player)) {
-            #if defined _DEBUG
-            host.printf("Erasing Asteroid #%d !\r\n", (*it)->getNumber());
-            #endif 
-            it = this->asteroids.erase(it);
-        }
+        this->next = rand() % GENERATION_CYCLES + 1;
+        this->delta = 0;
     }
 }
 
 void    Game::generate()
 {
-    static int current = 0;
-    this->asteroids.push_back(new Asteroid(++current));
-    #if defined _DEBUG
-        host.printf("New Asteroid #%d !\r\n", current);
-    #endif
+    this->asteroids.push_back(new Asteroid());
+}
+
+void    Game::move()
+{
+    this->mutex.lock(100);
+    std::list<Asteroid*>::iterator it;
+    for (it = this->asteroids.begin(); it != this->asteroids.end(); it++) {
+        if (!(*it)->move(this->player)) {
+            delete *it;
+            it = this->asteroids.erase(it);
+        }
+    }
+    this->mutex.unlock();
 }
 
 void    Game::display()
@@ -98,8 +118,8 @@
     this->lcd->cls();
     std::list<Asteroid*>::iterator it;
     for (it = this->asteroids.begin(); it != this->asteroids.end(); it++) {
-        this->lcd->pixel((*it)->getX(), (*it)->getY(), 1);    
-    } 
+        this->lcd->pixel((*it)->getX(), (*it)->getY(), 1);
+    }
     this->lcd->rect(this->player->getX(), this->player->getY(), this->player->getX() + 1, this->player->getY() + 1, 1);
     this->lcd->copy_to_lcd();
 }
\ No newline at end of file