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
Game.cpp@1:c6734b909bf0, 2016-02-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |