Guillaume Lefrant / Mbed 2 deprecated gtvl2_game

Dependencies:   C12832 FXOS8700Q mbed-rtos mbed

Game.cpp

Committer:
co838_gtvl2
Date:
2016-02-15
Revision:
0:9ec880239b3c
Child:
1:c6734b909bf0

File content as of revision 0:9ec880239b3c:

#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();
}