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:
0:9ec880239b3c
Child:
1:c6734b909bf0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Game.cpp	Mon Feb 15 18:18:16 2016 +0000
@@ -0,0 +1,105 @@
+#include "Game.h"
+
+#if defined _DEBUG
+Serial host(USBTX, USBRX);      // Serial Host
+#endif
+
+Game::Game()
+    : _thread(&Game::threader, this, osPriorityNormal,1024)
+{
+#if defined _DEBUG
+    host.baud(38400);
+#endif
+    this->player = new Player();
+    this->lcd = new C12832(D11, D13, D12, D7, D10);
+    this->lcd->set_auto_up(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);
+}
+
+Game::~Game()
+{
+    this->accel->disable();
+    this->_thread.terminate();
+    this->lcd->rect(this->player->getX() - 2, this->player->getY() - 2, this->player->getX() + 3, this->player->getY() + 3, 1);
+    this->lcd->copy_to_lcd();
+    this->lcd->locate(0, 0);
+    this->lcd->printf("GAME OVER");
+    delete this->player;
+    delete this->accel;
+    delete this->lcd;
+}
+
+void    Game::threader(void const *p)
+{
+    Game *instance = (Game*) p;
+    instance->watchAccel();
+}
+
+void    Game::loop()
+{
+    while (this->player->isAlive()) {
+        this->process();
+        this->display();
+        Thread::wait(DELTA_TIME);
+    }
+}
+
+void    Game::watchAccel()
+{
+    this->_thread.signal_wait(START_THREAD);
+    while (true) {
+        int16_t raX, raY;
+        this->accel->getX(&raX);
+        this->accel->getY(&raY);
+        this->player->move(-raX, raY - this->steadyPosition);
+        Thread::wait(DELTA_TIME);
+    }
+}
+
+void    Game::process()
+{
+    static int delta = 0;
+    static int next = rand() % 6;
+    if (delta >= next) {
+        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);
+        }
+    }
+}
+
+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
+}
+
+void    Game::display()
+{
+    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->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