Yang Hongxiao 201199678

Dependencies:   mbed

Control.cpp

Committer:
YHX
Date:
2020-05-14
Revision:
1:a6ead8050c23

File content as of revision 1:a6ead8050c23:

#include "Control.h"

Control::Control()
{

}

Control::~Control()
{

}

void Control::init(int platform_w,int platform_h,int r,int vv)
{
   
    _platform_w = platform_w;
    _platform_h = platform_h;
    _r = r;
    _vv = vv;
    _length =  45;
    _p.init(_length,_platform_h,_platform_w);
    _o.init();
    _bullet.init(_r,_vv);
}

void Control::read_input(Gamepad &pad)
{
    _d = pad.get_direction();
    _mag = pad.get_mag();
}

void Control::draw(N5110 &lcd)
{

    lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT);
    print_scores(lcd);
    _p.draw(lcd);
    _bullet.draw(lcd);
    _o.draw(lcd);
}

void Control::update(Gamepad &pad)
{
    check_goal(pad);
    _p.update(_d,_mag);
    _bullet.update();
    check_wall_collision(pad);
    check_platform_collisions(pad);
    check__obstacle_collisios(pad);
}

void Control::check_wall_collision(Gamepad &pad)
{
    Vector2D bullet_pos = _bullet.get_pos();
    Vector2D bullet_velocity = _bullet.get_velocity();

    if (bullet_pos.y <= 1) {  
        bullet_pos.y = 1;  
        bullet_velocity.y = -bullet_velocity.y;
        pad.tone(550.0,0.1);
    }
  
    else if (bullet_pos.x + _r >= (WIDTH-1) ) { 
        bullet_pos.x = (WIDTH-1) - _r;  
       bullet_velocity.x = -bullet_velocity.x;

        pad.tone(550.0,0.1);
    }

    else if (bullet_pos.x <= 1) { 
        bullet_pos.x = 1; 
        bullet_velocity.x = -bullet_velocity.x;
        pad.tone(550.0,0.1);
    }
    _bullet.set_velocity(bullet_velocity);
    _bullet.set_pos(bullet_pos);
}

void Control::check_platform_collisions(Gamepad &pad)
{
    Vector2D bullet_pos = _bullet.get_pos();
    Vector2D bullet_velocity = _bullet.get_velocity();

    Vector2D p_pos = _p.get_pos();

    if (
        (bullet_pos.y >= p_pos.y) &&                  
        (bullet_pos.y <= p_pos.y + _platform_h) && 
        (bullet_pos.x >= _length) && 
        (bullet_pos.x <= _length + _platform_w)
    ) {
        bullet_pos.y = _length+ _platform_h;
        bullet_velocity.y = -bullet_velocity.y;
        pad.tone(1000.0,0.1);
              
    }

    _bullet.set_velocity(bullet_velocity);
    _bullet.set_pos(bullet_pos);
}
void Control::check__obstacle_collisios(Gamepad &pad)
{
  
    Vector2D bullet_pos = _bullet.get_pos();
    Vector2D bullet_velocity = _bullet.get_velocity();
    Vector2D p_pos = _p.get_pos();
    Vector2D o_pos= _o.get_obstacle_pos();

    if ((bullet_pos.y >= o_pos.y) && 
        (bullet_pos.y <= o_pos.y + 2) &&
        (bullet_pos.x >= o_pos.x) && 
        (bullet_pos.x <= o_pos.x + 20) ){
       
        bullet_velocity.y = -bullet_velocity.y;
   
        pad.tone(1000.0,0.1);
        _p.add_score();
        _o.new_obstacle();
    }

    _bullet.set_velocity(bullet_velocity);
    _bullet.set_pos(bullet_pos);
}

void Control::check_goal(Gamepad &pad)
{
   
    Vector2D bullet_pos = _bullet.get_pos();
    
    if (bullet_pos.y > WIDTH) {
      
        _bullet.init(_r,_vv);
        pad.tone(1500.0,0.5);
        pad.leds_on();
        wait(0.5);
        pad.leds_off();
    }
}

void Control::print_scores(N5110 &lcd)
{
    int p_score = _p.get_score();
    char buffer1[14];
    sprintf(buffer1,"%2d",p_score);
    lcd.printString(buffer1,WIDTH/2 + 22,1); 
    
}