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
Diff: Game.cpp
- 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