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:
Wed Feb 17 10:14:33 2016 +0000
Revision:
2:9e0c826103d7
Parent:
1:c6734b909bf0
Unrealisable because memory in cpp isn't that good  :(

Who changed what in which revision?

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