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@2:9e0c826103d7, 2016-02-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |