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:
- 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