ELEC2645 (2018/19) / Mbed 2 deprecated el17aj

Dependencies:   mbed

GameEngine/GameEngine.cpp

Committer:
adat80
Date:
2019-04-28
Revision:
3:97cd7b3d89d0
Parent:
2:88019d96e1da
Child:
4:87f3f3e5cdd9

File content as of revision 3:97cd7b3d89d0:

#include "GameEngine.h"



int bulletSymbol[8][4] =   {
    { 0,1,1,0 },
    { 1,1,1,1 },
    { 1,1,1,1 },
    { 1,1,1,1 },
    { 1,1,1,1 },
    { 1,1,1,1 },
    { 0,0,0,0 },
    { 1,1,1,1 },
};

int healthSymbol[5][5] =   {
    { 1,1,1,1,1 },
    { 1,1,0,1,1 },
    { 1,0,0,0,1 },
    { 1,1,0,1,1 },
    { 1,1,1,1,1 },
};

int shot[5][5] =   {
    { 0,0,1,0,0 },
    { 0,1,1,1,0 },
    { 1,1,1,1,1 },
    { 0,1,1,1,0 },
    { 0,0,1,0,0 },
};


GameEngine::GameEngine()
{

}

GameEngine::~GameEngine()
{

}

void GameEngine::init(int CrossHairsSpeed, int fps)
{
    // initialise the game parameters
    _game_over = false;
    _fps = fps;
    _frame = 0;
    _levelNumber = 1;
    _killCount = 0;
    
    _wall.init(100);
    _crossHairs.init(CrossHairsSpeed);
    
    
    
    
    srand(time(NULL));
    
    _enemies = _level.init(_levelNumber);
    


    
    
    
    
}

void GameEngine::read_input(Gamepad &pad)
{
    _angle = pad.get_angle();
    _mag = pad.get_mag();
}

void GameEngine::draw(N5110 &lcd)
{
    
    
    char level[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    // so can display a string of a maximum 14 characters in length
    // or create formatted strings - ensure they aren't more than 14 characters long
    int length = sprintf(level,"lvl: %i",_levelNumber); // print formatted data to buffer
    // it is important the format specifier ensures the length will fit in the buffer
    if (length <= 14) {  // if string will fit on display (assuming printing at x=0)
        lcd.printString(level,23,0); 
    }
    
    
    //draw wall
    _wall.draw(lcd);
    
    
    
    //draw enemies
    for (int i=0; i < _level.get_number_of_enemies(); i++) {
        _enemies[i].draw(lcd);
    }
    
    _crossHairs.draw(lcd);
}

void GameEngine::update(Gamepad &pad)
{
    _frame = _frame + 1;
    if (_frame%(_fps/2) == 0) {
        
        for (int i=0; i < _level.get_number_of_enemies(); i++) {
            if(_enemies[i].get_current_action() == attacking) {
                _wall.take_damage(1);
                if (_wall.get_wall_health() < 0) {
                    _game_over = true;
                }
            }
        }
    }
    
    
    _level.update(_fps);
    _crossHairs.update(_angle,_mag, _fps);
    /*
    _enemy.update();
    _enemy2.update();
    */
    
    
    for (int i=0; i < _level.get_number_of_enemies(); i++) {
        _enemies[i].update(_fps);
    }
    
    if ( pad.check_event(Gamepad::B_PRESSED) == true) {
        fireShot(pad);
    } else if ( pad.check_event(Gamepad::A_PRESSED) == true) {
        fireShot(pad);
    }
    
        
    
}

void GameEngine::fireShot(Gamepad &gpad)
{
    
    

    Vector2D shotLoc = _crossHairs.get_pos();
    for(int i = 0; i < _level.get_number_of_enemies(); i++) {
        if (_enemies[i].get_alive()) {
            Vector2D enemyLoc = _enemies[i].get_pos();
            if (abs(enemyLoc.x - shotLoc.x) < 4) {
                if (abs(enemyLoc.y - shotLoc.y) < 4) {
                    _killCount = _killCount + 1;
                    _enemies[i].set_alive(false);
                    Action myAc;
                    myAc = dying;
                    _enemies[i].set_current_action(myAc);
                    
                    
                    if (_killCount == _level.get_number_of_enemies()) {
                        _killCount = 0;
                        _levelNumber = _levelNumber + 1;
                        _enemies = _level.init(_levelNumber);
                        
                    }
                    
                }
            }
        }
    }
}


    
bool GameEngine::get_game_over() {
    return _game_over;
    
}
void GameEngine::set_game_over(bool is_game_over) {
    _game_over = is_game_over;
}