Missile Control Game with uLCD

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Fork of missile_command by ECE 2035 TA

main.cpp

Committer:
ajindia6
Date:
2015-10-20
Revision:
2:eba4ed0263a4
Parent:
1:3da29f1d84b4

File content as of revision 2:eba4ed0263a4:

#include "mbed.h"
#include "uLCD_4DGL.h"
#include "wave_player.h"
#include "SDFileSystem.h"
#include "segment_display.h"

// Include header files for missile command project
#include "globals.h"
#include "city_landscape_public.h"
#include "missile_public.h"
#include "player.h"

// Platform initialization
DigitalIn left_pb(p23); DigitalIn right_pb(p21); DigitalIn fire_pb(p22); DigitalIn reset_pb(p24);
uLCD_4DGL uLCD(p28,p27,p29);
AnalogOut DACout(p18);
wave_player waver(&DACout);
SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs


void playSound(char * wav);
//Initialize variables
PLAYER_MISSILE missileArr [5];
PLAYER player;
int radius = 10;
int missileCount = 5;



//draw the anti missile
void player_missile_draw(PLAYER_MISSILE missile, int color) {
        
                int init_x, init_y, current_x, current_y;
                init_x = missile.source_x;
                init_y = 96;
                current_x = init_x;
                current_y = missile.y;
                uLCD.line(init_x, init_y, current_x, current_y, color);
                }
  // create the anti missile            
 void player_missile_create(void){
    int z;
    for(z=0;z<5;z++){
        if(missileArr[z].status == PLAYER_MISSILE_DEACTIVE){
            missileArr[z].y = 96;
            //each missile has its own tick
           
            //set a random source for the missile
            missileArr[z].source_x = player.x + 5;
            //set a random target for the missile
            missileArr[z].origin_y = 96;
            //the missile starts at its source
            
            missileArr[z].status = PLAYER_MISSILE_ACTIVE;
            break;
        }
    }
}            
              
            
            
void player_missile_update_position(void){
    int b;
    //controls how fast the missile will move
    
    //delta_x and delta_y account for the slope of the missile
    double delta_y;
    for(b=0;b<5;b++){
        if(missileArr[b].status == PLAYER_MISSILE_ACTIVE){
            // update missile position
            delta_y = 5;
            
            
            missileArr[b].y = missileArr[b].y - delta_y;
            
            
            // draw missile
            player_missile_draw(missileArr[b], PLAYER_COLOR);
            }
            if(missileArr[b].y < 0) {
                
                player_missile_draw(missileArr[b], BLACK_COLOR );
                missileArr[b].status = PLAYER_MISSILE_DEACTIVE;
                
            
            
        }       
        else if(missileArr[b].status == PLAYER_MISSILE_EXPLODED){
            // clear the missile on the screen
            player_missile_draw(missileArr[b], BLACK_COLOR);
            
            
            // we have done with this missile, remove it from record
            missileArr[b].status = PLAYER_MISSILE_DEACTIVE;
            //resets the missile's internal tick
            missileCount = missileCount + 1;
            
            
            }
        }
        
    }
    
void player_set_exploded(int index){
    // Error check
    ASSERT_P(index<MAX_NUM_MISSILE,ERROR_MISSILE_INDEX_UPDATE_STATUS);
    
    missileArr[index].status = PLAYER_MISSILE_EXPLODED;
    missileCount = missileCount + 1;
}
    
    


int main() {   
    
    uLCD.locate(0, 0);
    //uLCD.printf("Lvl:", level());
    //uLCD.printf("Score: %2d", s);
    //uLCD.prinf("Missiles: ", 
    //uLCD.printf("Lives: ", 
    setup_sequence();
    seg_driver_initialize();
    // 2.show numbers
    int i;
    for(i=0;i<10;i++){
        seg_driver(i);
        wait(0.2);
    }
    
    
    playSound("/sd/wavfiles/BUZZER.wav");
    
    
    // Draw cities
    city_landscape_init(4); 
    // Initialize the buttons        
    left_pb.mode(PullUp);  // The variable left_pb will be zero when the pushbutton for moving the player left is pressed    
    right_pb.mode(PullUp); // The variable rightt_pb will be zero when the pushbutton for moving the player right is pressed        
    fire_pb.mode(PullUp);  //the variable fire_pb will be zero when the pushbutton for firing a missile is pressed
    reset_pb.mode(PullUp);
    
    ///Begin the game loop
   
   player.x = 60;
   player_draw(player.x,100);
   int  d, w, l;
   int s = 0;
   int cityCount = 4;
   int lives = 3;
   
    
    while(1){
        
        
        //print Score and Lives
        uLCD.locate(0,0);
        uLCD.color(0x00FF00);
        uLCD.printf("Score: %2d \n", s);  
        uLCD.printf("Lives: %2d" , lives); 
        
        if (reset_pb == 0) {
            while(1) {
               wait(1);
               if(reset_pb == 0) {
                break; 
                }
            }
            }
               
        
        //If all 4 pushbuttons are pressed, jump to next level
        if (((left_pb == 0) && (right_pb == 0) && (fire_pb == 0) && (reset_pb == 0))) {
                                     while(1) {
                                        uLCD.filled_rectangle(0, 0, 128, 128, 0x000000);
                                        uLCD.locate(4, 5);
                                        uLCD.printf("Level 2!! \n \n");
                                        uLCD.printf("Incoming missiles are faster!");   
                                                                           
                                        wait(5);
                                        uLCD.locate(4,5);
                                        uLCD.color(0x000000);
                                        uLCD.printf("Level 2!! \n \n");
                                        uLCD.printf("Incoming missiles are faster!");  
                                        break;
                                        }
                                     city_landscape_init(4); 
                                     set_missile_speed(3);
                                     player_draw(player.x,100);
                                     
                                     } 
    
        missileCount = 5;
        for(l = 0; l<5; l++) {
            if(missileArr[l].status == PLAYER_MISSILE_ACTIVE) {
                missileCount = missileCount - 1;
                }
                seg_driver(missileCount);
            }
        
        
        
        
        
        missile_generator(); /// updates all incoming missiles on the screen
        
       
        if(left_pb == 0 && player.x>0){
            //Move player left
            player_draw(player.x,100);
            player_delete(player.x,100);
            player.x = player.x - 10;
            player_draw(player.x,100);
            
        }
        if(right_pb == 0 && player.x<110){
            //Move player right
            player_draw(player.x,100);
            player_delete(player.x,100);
            player.x = player.x + 10;
            player_draw(player.x,100); 
        }
        if(fire_pb == 0){
            
           
            //fire missile and make laser sound
            player_missile_create();
            
            // 
            playSound("/sd/wavfiles/LASER.wav");
            }
            player_missile_update_position();
            
            //missile-player collision
            for ( int p=0; p<5; p++) {
                MISSILE missile_record = missile_get_info(p);
                
                    int q,w, r, t;
                    q = player.x + 10;
                    w = 100;
                    r = player.x;
                    t = 96;
                    if((missile_record.x > r & missile_record.x<q) & (missile_record.y<w & missile_record.y>t & (missile_record.status==MISSILE_ACTIVE))) {
                            lives -= 1;
                            missile_set_exploded(p);
                            wait(1);
                            if(lives == 0) {
                            gameover(s);
                            
                            break;
                            }
                            
                        for(int j=0; j<11; j=j+3) {
                            uLCD.circle(missile_record.x, missile_record.y, j, YELLOW_COLOR);
                            uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR);
                                                 
                            
                            }
                            
                            
        }
    }
            
            
            
            //missile-city collision
            for ( int e=0; e<5; e++) {
                MISSILE missile_record = missile_get_info(e);
                for (int d = 0; d<5; d++) {
                    CITY city_record = city_get_info(d);
                    int f, g, h, i;
                    f = city_record.x + city_record.width;
                    g = city_record.y - city_record.height;
                    h = city_record.x;
                    i = city_record.y;
                    if((missile_record.x > h & missile_record.x<f) & (missile_record.y<i & missile_record.y>g) & (city_record.status == EXIST)) {
                        for(int j=0; j<11; j=j+3) {
                            uLCD.circle(missile_record.x, missile_record.y, j, YELLOW_COLOR);
                            uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR);
                                                   
                            
                            }
                            missile_set_exploded(e);
                            city_destroy(d);
                            cityCount = cityCount -1;
                            if(cityCount == 0) {
                               gameover(s);
                               } 
                    
                            break;
                            
                            }       
                    
                    }
                
                
                }      
            
            
            
            
           
           //missile-player_missile collision
            for(d=0; d<5; d++) {                
                for(w=0; w<5; w++) {          
                    MISSILE missile_record = missile_get_info(w);
                    double f;
                    f = (int)sqrt(pow((double)(missile_record.x-missileArr[d].source_x),2.0) +  pow((double)(missile_record.y-missileArr[d].y),2.0));              
                  
                         if((f<radius) && (missile_record.status == MISSILE_ACTIVE) && (missileArr[d].status== PLAYER_MISSILE_ACTIVE)) {
                                 for (int j=0; j< (radius+1); j = j+3) {
                                     uLCD.circle(missile_record.x, missile_record.y, j, 0xFFFF00);
                                                                         
                                     } 
                                     for (int j=0; j<(radius+1); j=j+3) {
                                         uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR);
                                         
                                         }
                                 missile_set_exploded(w);
                                 
                                 player_set_exploded(d);
                                 playSound("/sd/wavfiles/hit.wav");
                                 s= s+1;
                                 
                                 if (s==10 ) {
                                      while(1) {
                                        uLCD.filled_rectangle(0, 0, 128, 128, 0x000000);
                                        uLCD.locate(4, 5);
                                        uLCD.printf("Level 2!! \n \n");
                                        uLCD.printf("Incoming missiles are faster!");   
                                                                           
                                        wait(5);
                                        uLCD.locate(4,5);
                                        uLCD.color(0x000000);
                                        uLCD.printf("Level 2!! \n \n");
                                        uLCD.printf("Incoming missiles are faster!");  
                                        break;
                                        }
                                     city_landscape_init(4); 
                                     set_missile_speed(3);
                                     player_draw(player.x,100);
                                     
                                     }
                                     
                                
                    }
                
              }
              
        }
                                     
                                 
            
            
        }
    }



void playSound(char * wav) {
    // open wav file
    FILE *wave_file;
    wave_file=fopen(wav,"r");

    // play wav file
    waver.play(wave_file);

    // close wav file
    fclose(wave_file);
}