ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el18jkeo

Dependencies:   mbed

SpaceInvaderEngine/SpaceInvaderEngine.cpp

Committer:
josh_ohara
Date:
2020-05-14
Revision:
24:ff5af5a013b5
Parent:
23:aa86e32b6a74
Child:
27:eb755a345b1f

File content as of revision 24:ff5af5a013b5:


#include "SpaceInvaderEngine.h"

SpaceInvaderEngine::SpaceInvaderEngine()
{

}

SpaceInvaderEngine::~SpaceInvaderEngine()
{

}

void SpaceInvaderEngine::init(int ship_height, int ship_width, int alien_size, int no_aliens, int armada_column_size, int armada_row_size, int cover_y, int cover1_x, int cover2_x, int cover3_x, int no_rocks, int level) {
    
    S1_height = ship_height;
    S1_width = ship_width;
    A1_size = alien_size;
    
    Vector2D ship_pos = S1.get_position();
    S1x = ship_pos.x;
    S1y = ship_pos.y;
    
    N = no_aliens;
    CS = armada_column_size;
    RS = armada_row_size;
    
    Cy = cover_y;
    C1x = cover1_x;
    C2x = cover2_x;
    C3x = cover3_x;
    NR = no_rocks;
    
    A1.init(N,A1_size,CS,RS,level);
    S1.init(S1_height,S1_width);
    C1.init(C1x,Cy,NR);
    C2.init(C2x,Cy,NR);
    C3.init(C3x,Cy,NR);
 
}

void SpaceInvaderEngine::read_input(Gamepad &pad)
{
    D = pad.get_direction();
    Mag = pad.get_mag();
}
    
void SpaceInvaderEngine::render(N5110 &lcd)
{
    S1.render(lcd);
    A1.render(lcd);
    C1.render(lcd);
    C2.render(lcd);
    C3.render(lcd);
}

void SpaceInvaderEngine::update(Gamepad &pad, N5110 &lcd, int counter, int level)
{   
    get_ship_pos();
    S1.update(D,Mag,pad,lcd,counter);
    A1.update(pad, counter, level);
    ship_bullet_alien_collision(pad, lcd);
    ship_bullet_cover1_collision(pad, lcd);
    ship_bullet_cover2_collision(pad, lcd);
    ship_bullet_cover3_collision(pad, lcd);
    alien_bullet_ship_collision(pad, lcd);
    alien_bullet_cover1_collision(pad, lcd); 
    alien_bullet_cover2_collision(pad, lcd);
    alien_bullet_cover3_collision(pad, lcd);
    alien_ship_collision(pad, lcd);
    alien_cover1_collision(pad, lcd);
    alien_cover2_collision(pad, lcd);
    alien_cover3_collision(pad, lcd);
}

void SpaceInvaderEngine::get_ship_pos()
{
    Vector2D ship_pos = S1.get_position();
    S1x = ship_pos.x;
    S1y = ship_pos.y;
}

void SpaceInvaderEngine::ship_bullet_alien_collision(Gamepad &pad, N5110 &lcd){
    vector<Alien> alien_vector = A1.get_vector();
    vector<Bullet> bullet_vector = S1.get_bullet_vector();
    for(int i = 0; i < alien_vector.size(); i++){
        Vector2D alien_position = alien_vector[i].get_position();
        int alien_x = alien_position.x;
        int alien_y = alien_position.y;
        bool alien_life = alien_vector[i].get_life();
        for (int n = 0; n < bullet_vector.size(); n++){
            Vector2D bullet_position = bullet_vector[n].get_position();
            int bullet_x = bullet_position.x;
            int bullet_y = bullet_position.y;
            bool hit = bullet_vector[n].get_hit();
            if((alien_x <= bullet_x) && 
            (bullet_x <= alien_x + A1_size - 1)&&
            (alien_y <= bullet_y) &&
            (bullet_y <= alien_y + A1_size - 1)&&
            (hit==false)&&
            (alien_life == true)) {
                bool T = true;
                bool F = false;
                A1.set_life(i,F);
                S1.set_bullet_hit(n,T);
                pad.tone(600.0,0.2);
            }
        }
    }
}

void SpaceInvaderEngine::ship_bullet_cover1_collision(Gamepad &pad, N5110 &lcd){
    vector<Rock> cover_vector_1 = C1.get_vector();
    vector<Bullet> bullet_vector = S1.get_bullet_vector();
    for(int i = 0; i < cover_vector_1.size(); i++){
        Vector2D rock_position = cover_vector_1[i].get_position();
        int rock_x = rock_position.x;
        int rock_y = rock_position.y;
        bool rock_life = cover_vector_1[i].get_life();
        for (int n = 0; n < bullet_vector.size(); n++){
            Vector2D bullet_position = bullet_vector[n].get_position();
            int bullet_x = bullet_position.x;
            int bullet_y = bullet_position.y;
            bool hit = bullet_vector[n].get_hit();
            if((rock_x <= bullet_x) && 
            (bullet_x <= rock_x + 2)&&
            (rock_y <= bullet_y) &&
            (bullet_y <= rock_y + 2)&&
            (hit==false)&&
            (rock_life==true)){
                bool T = true;
                bool F = false;
                C1.set_life(i,F);
                S1.set_bullet_hit(n,T);
            }
        }
    }
}

void SpaceInvaderEngine::ship_bullet_cover2_collision(Gamepad &pad, N5110 &lcd){
    vector<Rock> cover_vector_2 = C2.get_vector();
    vector<Bullet> bullet_vector = S1.get_bullet_vector();
    for(int i = 0; i < cover_vector_2.size(); i++){
        Vector2D rock_position = cover_vector_2[i].get_position();
        int rock_x = rock_position.x;
        int rock_y = rock_position.y;
        bool rock_life = cover_vector_2[i].get_life();
        for (int n = 0; n < bullet_vector.size(); n++){
            Vector2D bullet_position = bullet_vector[n].get_position();
            int bullet_x = bullet_position.x;
            int bullet_y = bullet_position.y;
            bool hit = bullet_vector[n].get_hit();
            if((rock_x <= bullet_x) && 
            (bullet_x <= rock_x + 2)&&
            (rock_y <= bullet_y) &&
            (bullet_y <= rock_y + 2)&&
            (hit==false)&&
            (rock_life==true)){
                bool T = true;
                bool F = false;
                C2.set_life(i,F);
                S1.set_bullet_hit(n,T);
            }
        }
    }
}

void SpaceInvaderEngine::ship_bullet_cover3_collision(Gamepad &pad, N5110 &lcd){
    vector<Rock> cover_vector_3 = C3.get_vector();
    vector<Bullet> bullet_vector = S1.get_bullet_vector();
    for(int i = 0; i < cover_vector_3.size(); i++){
        Vector2D rock_position = cover_vector_3[i].get_position();
        int rock_x = rock_position.x;
        int rock_y = rock_position.y;
        bool rock_life = cover_vector_3[i].get_life();
        for (int n = 0; n < bullet_vector.size(); n++){
            Vector2D bullet_position = bullet_vector[n].get_position();
            int bullet_x = bullet_position.x;
            int bullet_y = bullet_position.y;
            bool hit = bullet_vector[n].get_hit();
            if((rock_x <= bullet_x) && 
            (bullet_x <= rock_x + 2)&&
            (rock_y <= bullet_y) &&
            (bullet_y <= rock_y + 2)&&
            (hit==false)&&
            (rock_life==true)){
                bool T = true;
                bool F = false;
                C3.set_life(i,F);
                S1.set_bullet_hit(n,T);
            }
        }
    }
}

void SpaceInvaderEngine::alien_bullet_ship_collision(Gamepad &pad, N5110 &lcd){
    Vector2D ship_position = S1.get_position();
    int ship_x = ship_position.x;
    int ship_y = ship_position.y;
    vector<Alien> alien_vector = A1.get_vector();
    for(int i = 0; i < alien_vector.size(); i++){
        vector<AlienBullet> alien_bullets = A1.get_alien_bullet_vector(i);
        for(int n = 0; n < alien_bullets.size(); n++){
            Vector2D bullet_position = alien_bullets[n].get_position();
            bool hit = alien_bullets[n].get_hit();
            int bullet_x = bullet_position.x;
            int bullet_y = bullet_position.y;
            if((ship_x <= bullet_x) && 
                (bullet_x <= ship_x + 8)&&
                (ship_y <= bullet_y) &&
                (bullet_y <= ship_y + 2)&&
                (hit==false)){
                S1.set_life(false);
                alien_bullets[n].set_hit(true);
            }
        }
    }
}

void SpaceInvaderEngine::alien_bullet_cover3_collision(Gamepad &pad, N5110 &lcd){
    vector<Rock> cover_vector_3 = C3.get_vector();
    vector<Alien> alien_vector = A1.get_vector();
       for(int q = 0; q < cover_vector_3.size(); q++){
        Vector2D rock_position = cover_vector_3[q].get_position();
        int rock_x = rock_position.x;
        int rock_y = rock_position.y;
        bool rock_life = cover_vector_3[q].get_life();
        for(int i = 0; i < alien_vector.size(); i++){
        vector<AlienBullet> alien_bullets = A1.get_alien_bullet_vector(i);
            for(int n = 0; n < alien_bullets.size(); n++){
                Vector2D bullet_position = alien_bullets[n].get_position();
                bool hit = alien_bullets[n].get_hit();
                int bullet_x = bullet_position.x;
                int bullet_y = bullet_position.y;
                if((rock_x <= bullet_x) && 
                    (bullet_x <= rock_x + 2)&&
                    (rock_y <= bullet_y) &&
                    (bullet_y <= rock_y + 2)&&
                    (hit==false)&&
                    (rock_life==true)){
                    C3.set_life(q,false);
                    A1.set_bullet_hit(i,n,true);
                }
            }
        }
    }
}

void SpaceInvaderEngine::alien_bullet_cover1_collision(Gamepad &pad, N5110 &lcd){
    vector<Rock> cover_vector_1 = C1.get_vector();
    vector<Alien> alien_vector = A1.get_vector();
       for(int q = 0; q < cover_vector_1.size(); q++){
        Vector2D rock_position = cover_vector_1[q].get_position();
        int rock_x = rock_position.x;
        int rock_y = rock_position.y;
        bool rock_life = cover_vector_1[q].get_life();
        for(int i = 0; i < alien_vector.size(); i++){
        vector<AlienBullet> alien_bullets = A1.get_alien_bullet_vector(i);
            for(int n = 0; n < alien_bullets.size(); n++){
                Vector2D bullet_position = alien_bullets[n].get_position();
                bool hit = alien_bullets[n].get_hit();
                int bullet_x = bullet_position.x;
                int bullet_y = bullet_position.y;
                if((rock_x <= bullet_x) && 
                    (bullet_x <= rock_x + 2)&&
                    (rock_y <= bullet_y) &&
                    (bullet_y <= rock_y + 2)&&
                    (hit==false)&&
                    (rock_life==true)){
                    C1.set_life(q,false);
                    A1.set_bullet_hit(i,n,true);
                }
            }
        }
    }
}

void SpaceInvaderEngine::alien_bullet_cover2_collision(Gamepad &pad, N5110 &lcd){
    vector<Rock> cover_vector_2 = C2.get_vector();
    vector<Alien> alien_vector = A1.get_vector();
        for(int q = 0; q < cover_vector_2.size(); q++){
        Vector2D rock_position = cover_vector_2[q].get_position();
        int rock_x = rock_position.x;
        int rock_y = rock_position.y;
        bool rock_life = cover_vector_2[q].get_life();
            for(int i = 0; i < alien_vector.size(); i++){
            vector<AlienBullet> alien_bullets = A1.get_alien_bullet_vector(i);
                for(int n = 0; n < alien_bullets.size(); n++){
                    Vector2D bullet_position = alien_bullets[n].get_position();
                    bool hit = alien_bullets[n].get_hit();
                    int bullet_x = bullet_position.x;
                    int bullet_y = bullet_position.y;
                    if((rock_x <= bullet_x) && 
                        (bullet_x <= rock_x + 2)&&
                        (rock_y <= bullet_y) &&
                        (bullet_y <= rock_y + 2)&&
                        (hit==false)&&
                        (rock_life==true)){
                        C2.set_life(q,false);
                        A1.set_bullet_hit(i,n,true);
                }
            }
        }
    }
}

void SpaceInvaderEngine::alien_ship_collision(Gamepad &pad, N5110 &lcd){
    Vector2D ship_position = S1.get_position();
    int ship_x = ship_position.x;
    int ship_y = ship_position.y;
    vector<Alien> alien_vector = A1.get_vector();
    for(int i = 0; i < alien_vector.size(); i++){
        Vector2D alien_position = alien_vector[i].get_position();
        int alien_x = alien_position.x;
        int alien_y = alien_position.y;
        for(int q = 0; q < 4; q++){
            for(int n = 0; n < 4; n++){
                if((ship_x - 1 < alien_x + q) &&
                    (ship_x + 9 > alien_x + q)&&
                    (ship_y - 1 < alien_y + n)&&
                    (S1.get_life()==true)&&
                    (A1.get_life(i)==true)){
                    S1.set_life(false);
                    A1.set_life(i,false);
                }
            }
        }
    }
}


void SpaceInvaderEngine::alien_cover1_collision(Gamepad &pad, N5110 &lcd){
    vector<Alien> alien_vector = A1.get_vector();
    vector<Rock> cover1 = C1.get_vector();
    for(int i = 0; i < alien_vector.size(); i++){
        Vector2D alien_position = alien_vector[i].get_position();
        int alien_x = alien_position.x;
        int alien_y = alien_position.y;
        for(int p = 0; p < cover1.size(); p++){
            Vector2D rock_position = cover1[p].get_position();
            int rock_x = rock_position.x;
            int rock_y = rock_position.y;
            for(int q = 0; q < 4; q++){
                for(int s = 0; s < 4; s++){
                    if((rock_x < alien_x + q) &&
                        (rock_x + 2 > alien_x + q)&&
                        (rock_y < alien_y + s)&&
                        (rock_y + 2 > alien_y + s)&&
                        (C1.get_life(p)==true)&&
                        (A1.get_life(i)==true)){
                        C1.set_life(p,false);
                        A1.set_life(i,false);
                    }
                }
            }
        }
    }
}

void SpaceInvaderEngine::alien_cover2_collision(Gamepad &pad, N5110 &lcd){
    vector<Alien> alien_vector = A1.get_vector();
    vector<Rock> cover2 = C2.get_vector();
    for(int i = 0; i < alien_vector.size(); i++){
        Vector2D alien_position = alien_vector[i].get_position();
        int alien_x = alien_position.x;
        int alien_y = alien_position.y;
        for(int p = 0; p < cover2.size(); p++){
            Vector2D rock_position = cover2[p].get_position();
            int rock_x = rock_position.x;
            int rock_y = rock_position.y;
            for(int q = 0; q < 4; q++){
                for(int s = 0; s < 4; s++){
                    if((rock_x < alien_x + q) &&
                        (rock_x + 2 > alien_x + q)&&
                        (rock_y < alien_y + s)&&
                        (rock_y + 2 > alien_y + s)&&
                        (C2.get_life(p)==true)&&
                        (A1.get_life(i)==true)){
                        C2.set_life(p,false);
                        A1.set_life(i,false);
                    }
                }
            }
        }
    }
}

void SpaceInvaderEngine::alien_cover3_collision(Gamepad &pad, N5110 &lcd){
    vector<Alien> alien_vector = A1.get_vector();
    vector<Rock> cover3 = C3.get_vector();
    for(int i = 0; i < alien_vector.size(); i++){
        Vector2D alien_position = alien_vector[i].get_position();
        int alien_x = alien_position.x;
        int alien_y = alien_position.y;
        for(int p = 0; p < cover3.size(); p++){
            Vector2D rock_position = cover3[p].get_position();
            int rock_x = rock_position.x;
            int rock_y = rock_position.y;
            for(int q = 0; q < 4; q++){
                for(int s = 0; s < 4; s++){
                    if((rock_x < alien_x + q) &&
                        (rock_x + 2 > alien_x + q)&&
                        (rock_y < alien_y + s)&&
                        (rock_y + 2 > alien_y + s)&&
                        (C3.get_life(p)==true)&&
                        (A1.get_life(i)==true)){
                        C3.set_life(p,false);
                        A1.set_life(i,false);
                    }
                }
            }
        }
    }
}

bool SpaceInvaderEngine::get_armada_life(){
    return A1.get_armada_life();
}

bool SpaceInvaderEngine::get_ship_life(){
    return S1.get_life();
    }
    
void SpaceInvaderEngine::kill_all(){
    vector<Rock> cover_vector_1 = C1.get_vector();
    vector<Rock> cover_vector_2 = C2.get_vector();
    vector<Rock> cover_vector_3 = C3.get_vector();
    for(int i = 0; i < cover_vector_1.size(); i++){
        C1.set_life(i,false);
        C2.set_life(i,false);
        C3.set_life(i,false);
    }
    vector<Bullet> ship_bullet_vector = S1.get_bullet_vector();
    for(int n = 0; n < ship_bullet_vector.size(); n++){
        S1.set_bullet_hit(n,true);
    }
    vector<Alien> alien_vector = A1.get_vector();
    for(int p = 0; p < alien_vector.size(); p++){
    vector<AlienBullet> alien_bullets = A1.get_alien_bullet_vector(p);
        for(int q = 0; q < alien_bullets.size(); q++){
            A1.set_bullet_hit(p,q,true);
        }
    }
    S1.set_life(false);
}