The library for the game engine

GameEngine.cpp

Committer:
JasonGuo
Date:
2017-05-04
Revision:
8:661097776006
Child:
9:bd53c6e90213

File content as of revision 8:661097776006:

#include "GameEngine.h"
//funtion to construct
GameEngine::GameEngine()
{
    
}

//function to destruct
GameEngine::~GameEngine()
{
    
}

//function to initialise the game parameters
void GameEngine::init()
{
    monster_number = 50;                // monster number is set to 50
    life = 3;                           // 3 chances to miss the monster 
    _A = 0;                             // A button check 
    
    _Jet.init();                        // initialise the jet
    _Monster.init();                    // initialise the monster
}

//function to read inputs
void GameEngine::read_input(Gamepad &pad)
{
    _d = pad.get_direction();           // get the move direction of the joystick
    _mag = pad.get_mag();               // get the move magnitude of the joystick
    check_fire(pad);                    // check if the fire button is pressed
}

//function to draw all elements
void GameEngine::draw(N5110 &lcd)
{
    // the bitmap of the cloud
    static int cloud[] = 
    {    
        0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,
        0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,
        0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,
        0,1,0,0,0,0,0,0,0,1,0,1,1,0,0,
        1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
        0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,
        0,0,0,1,1,0,0,1,0,1,0,0,1,0,0,
        0,0,0,0,0,1,1,0,0,0,1,1,0,0,0, 
    };
    lcd.clear();
    Bitmap sprite(cloud, 10, 15);                   // rows & columns of the cloud
    sprite.render(lcd, 60, 5);                      // draw clouds
    sprite.render(lcd, 10, 32);
    _Jet.draw(lcd);                                 // draw jet
    _Monster.draw(lcd);                             // draw monster
    if(_A == 1)                                     // if fire button is  pressed
    {
        _Ammo.draw(lcd);                            // draw bullet
    }
    sprite.render(lcd, 35, 19);
    
    sprintf(life_buffer,"x%d",life);
    lcd.printString(life_buffer,1,0);               // draw life value
    sprintf(number_buffer,"%d",monster_number);
    lcd.printString(number_buffer,25,0);            // draw monster number
    lcd.refresh();
}

//function to update game parameters
void GameEngine::update(Gamepad &pad)
{
    _Jet.update(_d,_mag);                           // update jet position
    _Ammo.update();                                 // update ammo position
    _Monster.update();                              // update monster position
    check_hit_monster(pad);                         // check if the monster is killed
    check_Jet_collision(pad);                       // check if the jet crashed
    check_hit_wall(pad);                            // check if the monster hits the wall
}

//function to check the fire button
void GameEngine::check_fire(Gamepad &pad)
{
    // intialise the bullet if the fire button if pressed
    // the coordinates of the bullet is according to the coordinates of the jet
    if (pad.check_event(Gamepad::A_PRESSED) == true)
        {
          pad.tone(1000.0,0.1);
          Vector2D Jet_pos = _Jet.get_pos();
          //printf("x=%f,y=%f\n", Jet_pos.x, Jet_pos.y);     
          _Ammo.init(Jet_pos.x+7, Jet_pos.y+5);
          _A = 1;
        }  
}

//function to check if the jet crashs
void GameEngine::check_Jet_collision(Gamepad &pad)
{
    Vector2D Jet_pos = _Jet.get_pos();
    Vector2D Monster_pos = _Monster.get_pos();
    //printf("Jet_x=%f,Jet_y=%f\n",Jet_pos.x,Jet_pos.y);
    //printf("M_x=%f,M_y=%f\n",Monster_pos.x, Monster_pos.y);
    
    // game over when the monster hits the jet
    if(
    (Jet_pos.x+13 > Monster_pos.x)&&    // right
    (Jet_pos.x < Monster_pos.x+10)&&    // left
    (Jet_pos.y+12 > Monster_pos.y)&&    // top
    (Jet_pos.y < Monster_pos.y+10))     // bottom
    {
        life -= 1;
        _Monster.init();
    }    
}

//function to check if the monster is killed
void GameEngine::check_hit_monster(Gamepad &pad)
{
    Vector2D Ammo_pos = _Ammo.get_pos();
    Vector2D Monster_pos = _Monster.get_pos();
    
    // monster diappears if the bullet hits the monster
    // set new monster
    if(
    (Ammo_pos.x+1 > Monster_pos.x)&&
    (Ammo_pos.y+1 >= Monster_pos.y)&&
    (Ammo_pos.y+1< Monster_pos.y+10)&&
    (_A ==1))
    {
        pad.tone(100.0,0.2);
        pad.leds_off();
        _A = 0; //Ammo disappears after hit the monster
        monster_number -= 1;
        _Monster.init();
        _Jet.~Jet(); 
    }
    // monster reaches the left edge of the screen
    // can miss 3 monsters maximum
    else if (Monster_pos.x+9 <= 1)
    {
        life -= 1;
        pad.tone(300.0,0.2);
        _Monster.init();
    }
}

//function to check if the monster hits the wall
void GameEngine::check_hit_wall(Gamepad &pad)
{
    Vector2D Monster_pos = _Monster.get_pos();
    Vector2D Monster_velocity = _Monster.get_velocity();
    
    // the monster bounces back when it hits the wall
    if(Monster_pos.y <= 0)
    {   
        Monster_pos.y = 0;                          // top
        Monster_velocity.y = -Monster_velocity.y;
        pad.tone(500.0,0.2);    
    }
    else if(Monster_pos.y >= HEIGHT - 8)
    {
        Monster_pos.y = HEIGHT - 8;                 // bottom
        Monster_velocity.y = -Monster_velocity.y;
        pad.tone(500.0,0.2);
    }
    _Monster.set_velocity(Monster_velocity);        // set velocity
    _Monster.set_pos(Monster_pos);                  //monster stays on the screen
}

//function to get the value of life
int GameEngine::get_life()
{
    return life;   
}

//function to get the monster number
int GameEngine::get_monster_number()
{
    return monster_number;    
}