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

Committer:
co838_gtvl2
Date:
Tue Feb 16 22:25:42 2016 +0000
Revision:
1:c6734b909bf0
Parent:
0:9ec880239b3c
Child:
2:9e0c826103d7
Added boost by pressing the joystick on the shield.; Added mutex to have a better stability.; Still a bug when the game stays for too long.  :(

Who changed what in which revision?

UserRevisionLine numberNew contents of line
co838_gtvl2 0:9ec880239b3c 1 #include "Game.h"
co838_gtvl2 0:9ec880239b3c 2
co838_gtvl2 0:9ec880239b3c 3 #if defined _DEBUG
co838_gtvl2 0:9ec880239b3c 4 Serial host(USBTX, USBRX); // Serial Host
co838_gtvl2 0:9ec880239b3c 5 #endif
co838_gtvl2 0:9ec880239b3c 6
co838_gtvl2 0:9ec880239b3c 7 Game::Game()
co838_gtvl2 1:c6734b909bf0 8 : thread(&Game::threader, this, osPriorityNormal,1024),
co838_gtvl2 1:c6734b909bf0 9 mutex(),
co838_gtvl2 1:c6734b909bf0 10 boost(D4)
co838_gtvl2 0:9ec880239b3c 11 {
co838_gtvl2 0:9ec880239b3c 12 #if defined _DEBUG
co838_gtvl2 0:9ec880239b3c 13 host.baud(38400);
co838_gtvl2 0:9ec880239b3c 14 #endif
co838_gtvl2 0:9ec880239b3c 15 this->player = new Player();
co838_gtvl2 0:9ec880239b3c 16 this->lcd = new C12832(D11, D13, D12, D7, D10);
co838_gtvl2 0:9ec880239b3c 17 this->lcd->set_auto_up(0);
co838_gtvl2 1:c6734b909bf0 18 this->score = 0;
co838_gtvl2 1:c6734b909bf0 19 this->next = 0;
co838_gtvl2 1:c6734b909bf0 20 this->delta = 0;
co838_gtvl2 0:9ec880239b3c 21 this->accel = new FXOS8700Q_acc(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1);
co838_gtvl2 0:9ec880239b3c 22 this->accel->enable();
co838_gtvl2 0:9ec880239b3c 23 this->accel->getY(&this->steadyPosition);
co838_gtvl2 0:9ec880239b3c 24 this->asteroids = std::list<Asteroid*>();
co838_gtvl2 1:c6734b909bf0 25 this->thread.signal_set(START_THREAD);
co838_gtvl2 1:c6734b909bf0 26 srand(time(NULL));
co838_gtvl2 0:9ec880239b3c 27 }
co838_gtvl2 0:9ec880239b3c 28
co838_gtvl2 0:9ec880239b3c 29 Game::~Game()
co838_gtvl2 0:9ec880239b3c 30 {
co838_gtvl2 1:c6734b909bf0 31 this->thread.terminate();
co838_gtvl2 0:9ec880239b3c 32 this->accel->disable();
co838_gtvl2 1:c6734b909bf0 33 this->display();
co838_gtvl2 0:9ec880239b3c 34 this->lcd->rect(this->player->getX() - 2, this->player->getY() - 2, this->player->getX() + 3, this->player->getY() + 3, 1);
co838_gtvl2 1:c6734b909bf0 35 this->lcd->locate(0, 0);
co838_gtvl2 1:c6734b909bf0 36 this->lcd->printf("GAME OVER\r\nScore: %d\r\n", this->score);
co838_gtvl2 0:9ec880239b3c 37 this->lcd->copy_to_lcd();
co838_gtvl2 0:9ec880239b3c 38 delete this->player;
co838_gtvl2 0:9ec880239b3c 39 delete this->accel;
co838_gtvl2 0:9ec880239b3c 40 delete this->lcd;
co838_gtvl2 0:9ec880239b3c 41 }
co838_gtvl2 0:9ec880239b3c 42
co838_gtvl2 0:9ec880239b3c 43 void Game::threader(void const *p)
co838_gtvl2 0:9ec880239b3c 44 {
co838_gtvl2 0:9ec880239b3c 45 Game *instance = (Game*) p;
co838_gtvl2 0:9ec880239b3c 46 instance->watchAccel();
co838_gtvl2 0:9ec880239b3c 47 }
co838_gtvl2 0:9ec880239b3c 48
co838_gtvl2 0:9ec880239b3c 49 void Game::loop()
co838_gtvl2 0:9ec880239b3c 50 {
co838_gtvl2 0:9ec880239b3c 51 while (this->player->isAlive()) {
co838_gtvl2 0:9ec880239b3c 52 this->process();
co838_gtvl2 0:9ec880239b3c 53 this->display();
co838_gtvl2 1:c6734b909bf0 54 ++this->score;
co838_gtvl2 0:9ec880239b3c 55 Thread::wait(DELTA_TIME);
co838_gtvl2 0:9ec880239b3c 56 }
co838_gtvl2 0:9ec880239b3c 57 }
co838_gtvl2 0:9ec880239b3c 58
co838_gtvl2 0:9ec880239b3c 59 void Game::watchAccel()
co838_gtvl2 0:9ec880239b3c 60 {
co838_gtvl2 1:c6734b909bf0 61 this->thread.signal_wait(START_THREAD);
co838_gtvl2 0:9ec880239b3c 62 while (true) {
co838_gtvl2 0:9ec880239b3c 63 int16_t raX, raY;
co838_gtvl2 0:9ec880239b3c 64 this->accel->getX(&raX);
co838_gtvl2 0:9ec880239b3c 65 this->accel->getY(&raY);
co838_gtvl2 1:c6734b909bf0 66 this->mutex.lock(100);
co838_gtvl2 0:9ec880239b3c 67 this->player->move(-raX, raY - this->steadyPosition);
co838_gtvl2 1:c6734b909bf0 68 this->mutex.unlock();
co838_gtvl2 1:c6734b909bf0 69 Thread::wait(this->boost ? DELTA_TIME / 2 : DELTA_TIME);
co838_gtvl2 0:9ec880239b3c 70 }
co838_gtvl2 0:9ec880239b3c 71 }
co838_gtvl2 0:9ec880239b3c 72
co838_gtvl2 0:9ec880239b3c 73 void Game::process()
co838_gtvl2 0:9ec880239b3c 74 {
co838_gtvl2 1:c6734b909bf0 75 this->factory();
co838_gtvl2 1:c6734b909bf0 76 #if defined _DEBUG
co838_gtvl2 1:c6734b909bf0 77 host.printf("Currently %d Asteroid(s).\r\n", this->asteroids.size());
co838_gtvl2 1:c6734b909bf0 78 #endif
co838_gtvl2 1:c6734b909bf0 79 this->move();
co838_gtvl2 1:c6734b909bf0 80 }
co838_gtvl2 1:c6734b909bf0 81
co838_gtvl2 1:c6734b909bf0 82 void Game::factory()
co838_gtvl2 1:c6734b909bf0 83 {
co838_gtvl2 1:c6734b909bf0 84 ++this->delta;
co838_gtvl2 1:c6734b909bf0 85 #if defined _DEBUG
co838_gtvl2 1:c6734b909bf0 86 host.printf("=> [%c] next asteroid in %d/%d cycle(s).\r\n", this->delta >= this->next ? '1' : '0', this->delta, this->next);
co838_gtvl2 1:c6734b909bf0 87 #endif
co838_gtvl2 1:c6734b909bf0 88 if (this->delta >= this->next && (MAX_ASTEROID_NBS != 0 ? this->asteroids.size() <= MAX_ASTEROID_NBS : true)) {
co838_gtvl2 1:c6734b909bf0 89 #if defined _DEBUG
co838_gtvl2 1:c6734b909bf0 90 host.printf("\t***** GENERATION !!!! *****\r\n");
co838_gtvl2 1:c6734b909bf0 91 #endif
co838_gtvl2 0:9ec880239b3c 92 this->generate();
co838_gtvl2 1:c6734b909bf0 93 this->next = rand() % GENERATION_CYCLES + 1;
co838_gtvl2 1:c6734b909bf0 94 this->delta = 0;
co838_gtvl2 0:9ec880239b3c 95 }
co838_gtvl2 0:9ec880239b3c 96 }
co838_gtvl2 0:9ec880239b3c 97
co838_gtvl2 0:9ec880239b3c 98 void Game::generate()
co838_gtvl2 0:9ec880239b3c 99 {
co838_gtvl2 1:c6734b909bf0 100 this->asteroids.push_back(new Asteroid());
co838_gtvl2 1:c6734b909bf0 101 }
co838_gtvl2 1:c6734b909bf0 102
co838_gtvl2 1:c6734b909bf0 103 void Game::move()
co838_gtvl2 1:c6734b909bf0 104 {
co838_gtvl2 1:c6734b909bf0 105 this->mutex.lock(100);
co838_gtvl2 1:c6734b909bf0 106 std::list<Asteroid*>::iterator it;
co838_gtvl2 1:c6734b909bf0 107 for (it = this->asteroids.begin(); it != this->asteroids.end(); it++) {
co838_gtvl2 1:c6734b909bf0 108 if (!(*it)->move(this->player)) {
co838_gtvl2 1:c6734b909bf0 109 delete *it;
co838_gtvl2 1:c6734b909bf0 110 it = this->asteroids.erase(it);
co838_gtvl2 1:c6734b909bf0 111 }
co838_gtvl2 1:c6734b909bf0 112 }
co838_gtvl2 1:c6734b909bf0 113 this->mutex.unlock();
co838_gtvl2 0:9ec880239b3c 114 }
co838_gtvl2 0:9ec880239b3c 115
co838_gtvl2 0:9ec880239b3c 116 void Game::display()
co838_gtvl2 0:9ec880239b3c 117 {
co838_gtvl2 0:9ec880239b3c 118 this->lcd->cls();
co838_gtvl2 0:9ec880239b3c 119 std::list<Asteroid*>::iterator it;
co838_gtvl2 0:9ec880239b3c 120 for (it = this->asteroids.begin(); it != this->asteroids.end(); it++) {
co838_gtvl2 1:c6734b909bf0 121 this->lcd->pixel((*it)->getX(), (*it)->getY(), 1);
co838_gtvl2 1:c6734b909bf0 122 }
co838_gtvl2 0:9ec880239b3c 123 this->lcd->rect(this->player->getX(), this->player->getY(), this->player->getX() + 1, this->player->getY() + 1, 1);
co838_gtvl2 0:9ec880239b3c 124 this->lcd->copy_to_lcd();
co838_gtvl2 0:9ec880239b3c 125 }