Arnav Jindia / Mbed 2 deprecated Missile_Control_Game

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Fork of missile_command by ECE 2035 TA

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "uLCD_4DGL.h"
00003 #include "wave_player.h"
00004 #include "SDFileSystem.h"
00005 #include "segment_display.h"
00006 
00007 // Include header files for missile command project
00008 #include "globals.h"
00009 #include "city_landscape_public.h"
00010 #include "missile_public.h"
00011 #include "player.h"
00012 
00013 // Platform initialization
00014 DigitalIn left_pb(p23); DigitalIn right_pb(p21); DigitalIn fire_pb(p22); DigitalIn reset_pb(p24);
00015 uLCD_4DGL uLCD(p28,p27,p29);
00016 AnalogOut DACout(p18);
00017 wave_player waver(&DACout);
00018 SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs
00019 
00020 
00021 void playSound(char * wav);
00022 //Initialize variables
00023 PLAYER_MISSILE missileArr [5];
00024 PLAYER player;
00025 int radius = 10;
00026 int missileCount = 5;
00027 
00028 
00029 
00030 //draw the anti missile
00031 void player_missile_draw(PLAYER_MISSILE missile, int color) {
00032         
00033                 int init_x, init_y, current_x, current_y;
00034                 init_x = missile.source_x;
00035                 init_y = 96;
00036                 current_x = init_x;
00037                 current_y = missile.y;
00038                 uLCD.line(init_x, init_y, current_x, current_y, color);
00039                 }
00040   // create the anti missile            
00041  void player_missile_create(void){
00042     int z;
00043     for(z=0;z<5;z++){
00044         if(missileArr[z].status == PLAYER_MISSILE_DEACTIVE){
00045             missileArr[z].y = 96;
00046             //each missile has its own tick
00047            
00048             //set a random source for the missile
00049             missileArr[z].source_x = player.x + 5;
00050             //set a random target for the missile
00051             missileArr[z].origin_y = 96;
00052             //the missile starts at its source
00053             
00054             missileArr[z].status = PLAYER_MISSILE_ACTIVE;
00055             break;
00056         }
00057     }
00058 }            
00059               
00060             
00061             
00062 void player_missile_update_position(void){
00063     int b;
00064     //controls how fast the missile will move
00065     
00066     //delta_x and delta_y account for the slope of the missile
00067     double delta_y;
00068     for(b=0;b<5;b++){
00069         if(missileArr[b].status == PLAYER_MISSILE_ACTIVE){
00070             // update missile position
00071             delta_y = 5;
00072             
00073             
00074             missileArr[b].y = missileArr[b].y - delta_y;
00075             
00076             
00077             // draw missile
00078             player_missile_draw(missileArr[b], PLAYER_COLOR);
00079             }
00080             if(missileArr[b].y < 0) {
00081                 
00082                 player_missile_draw(missileArr[b], BLACK_COLOR );
00083                 missileArr[b].status = PLAYER_MISSILE_DEACTIVE;
00084                 
00085             
00086             
00087         }       
00088         else if(missileArr[b].status == PLAYER_MISSILE_EXPLODED){
00089             // clear the missile on the screen
00090             player_missile_draw(missileArr[b], BLACK_COLOR);
00091             
00092             
00093             // we have done with this missile, remove it from record
00094             missileArr[b].status = PLAYER_MISSILE_DEACTIVE;
00095             //resets the missile's internal tick
00096             missileCount = missileCount + 1;
00097             
00098             
00099             }
00100         }
00101         
00102     }
00103     
00104 void player_set_exploded(int index){
00105     // Error check
00106     ASSERT_P(index<MAX_NUM_MISSILE,ERROR_MISSILE_INDEX_UPDATE_STATUS);
00107     
00108     missileArr[index].status = PLAYER_MISSILE_EXPLODED;
00109     missileCount = missileCount + 1;
00110 }
00111     
00112     
00113 
00114 
00115 int main() {   
00116     
00117     uLCD.locate(0, 0);
00118     //uLCD.printf("Lvl:", level());
00119     //uLCD.printf("Score: %2d", s);
00120     //uLCD.prinf("Missiles: ", 
00121     //uLCD.printf("Lives: ", 
00122     setup_sequence();
00123     seg_driver_initialize();
00124     // 2.show numbers
00125     int i;
00126     for(i=0;i<10;i++){
00127         seg_driver(i);
00128         wait(0.2);
00129     }
00130     
00131     
00132     playSound("/sd/wavfiles/BUZZER.wav");
00133     
00134     
00135     // Draw cities
00136     city_landscape_init(4); 
00137     // Initialize the buttons        
00138     left_pb.mode(PullUp);  // The variable left_pb will be zero when the pushbutton for moving the player left is pressed    
00139     right_pb.mode(PullUp); // The variable rightt_pb will be zero when the pushbutton for moving the player right is pressed        
00140     fire_pb.mode(PullUp);  //the variable fire_pb will be zero when the pushbutton for firing a missile is pressed
00141     reset_pb.mode(PullUp);
00142     
00143     ///Begin the game loop
00144    
00145    player.x = 60;
00146    player_draw(player.x,100);
00147    int  d, w, l;
00148    int s = 0;
00149    int cityCount = 4;
00150    int lives = 3;
00151    
00152     
00153     while(1){
00154         
00155         
00156         //print Score and Lives
00157         uLCD.locate(0,0);
00158         uLCD.color(0x00FF00);
00159         uLCD.printf("Score: %2d \n", s);  
00160         uLCD.printf("Lives: %2d" , lives); 
00161         
00162         if (reset_pb == 0) {
00163             while(1) {
00164                wait(1);
00165                if(reset_pb == 0) {
00166                 break; 
00167                 }
00168             }
00169             }
00170                
00171         
00172         //If all 4 pushbuttons are pressed, jump to next level
00173         if (((left_pb == 0) && (right_pb == 0) && (fire_pb == 0) && (reset_pb == 0))) {
00174                                      while(1) {
00175                                         uLCD.filled_rectangle(0, 0, 128, 128, 0x000000);
00176                                         uLCD.locate(4, 5);
00177                                         uLCD.printf("Level 2!! \n \n");
00178                                         uLCD.printf("Incoming missiles are faster!");   
00179                                                                            
00180                                         wait(5);
00181                                         uLCD.locate(4,5);
00182                                         uLCD.color(0x000000);
00183                                         uLCD.printf("Level 2!! \n \n");
00184                                         uLCD.printf("Incoming missiles are faster!");  
00185                                         break;
00186                                         }
00187                                      city_landscape_init(4); 
00188                                      set_missile_speed(3);
00189                                      player_draw(player.x,100);
00190                                      
00191                                      } 
00192     
00193         missileCount = 5;
00194         for(l = 0; l<5; l++) {
00195             if(missileArr[l].status == PLAYER_MISSILE_ACTIVE) {
00196                 missileCount = missileCount - 1;
00197                 }
00198                 seg_driver(missileCount);
00199             }
00200         
00201         
00202         
00203         
00204         
00205         missile_generator(); /// updates all incoming missiles on the screen
00206         
00207        
00208         if(left_pb == 0 && player.x>0){
00209             //Move player left
00210             player_draw(player.x,100);
00211             player_delete(player.x,100);
00212             player.x = player.x - 10;
00213             player_draw(player.x,100);
00214             
00215         }
00216         if(right_pb == 0 && player.x<110){
00217             //Move player right
00218             player_draw(player.x,100);
00219             player_delete(player.x,100);
00220             player.x = player.x + 10;
00221             player_draw(player.x,100); 
00222         }
00223         if(fire_pb == 0){
00224             
00225            
00226             //fire missile and make laser sound
00227             player_missile_create();
00228             
00229             // 
00230             playSound("/sd/wavfiles/LASER.wav");
00231             }
00232             player_missile_update_position();
00233             
00234             //missile-player collision
00235             for ( int p=0; p<5; p++) {
00236                 MISSILE missile_record = missile_get_info(p);
00237                 
00238                     int q,w, r, t;
00239                     q = player.x + 10;
00240                     w = 100;
00241                     r = player.x;
00242                     t = 96;
00243                     if((missile_record.x > r & missile_record.x<q) & (missile_record.y<w & missile_record.y>t & (missile_record.status==MISSILE_ACTIVE))) {
00244                             lives -= 1;
00245                             missile_set_exploded(p);
00246                             wait(1);
00247                             if(lives == 0) {
00248                             gameover(s);
00249                             
00250                             break;
00251                             }
00252                             
00253                         for(int j=0; j<11; j=j+3) {
00254                             uLCD.circle(missile_record.x, missile_record.y, j, YELLOW_COLOR);
00255                             uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR);
00256                                                  
00257                             
00258                             }
00259                             
00260                             
00261         }
00262     }
00263             
00264             
00265             
00266             //missile-city collision
00267             for ( int e=0; e<5; e++) {
00268                 MISSILE missile_record = missile_get_info(e);
00269                 for (int d = 0; d<5; d++) {
00270                     CITY city_record = city_get_info(d);
00271                     int f, g, h, i;
00272                     f = city_record.x + city_record.width;
00273                     g = city_record.y - city_record.height;
00274                     h = city_record.x;
00275                     i = city_record.y;
00276                     if((missile_record.x > h & missile_record.x<f) & (missile_record.y<i & missile_record.y>g) & (city_record.status == EXIST)) {
00277                         for(int j=0; j<11; j=j+3) {
00278                             uLCD.circle(missile_record.x, missile_record.y, j, YELLOW_COLOR);
00279                             uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR);
00280                                                    
00281                             
00282                             }
00283                             missile_set_exploded(e);
00284                             city_destroy(d);
00285                             cityCount = cityCount -1;
00286                             if(cityCount == 0) {
00287                                gameover(s);
00288                                } 
00289                     
00290                             break;
00291                             
00292                             }       
00293                     
00294                     }
00295                 
00296                 
00297                 }      
00298             
00299             
00300             
00301             
00302            
00303            //missile-player_missile collision
00304             for(d=0; d<5; d++) {                
00305                 for(w=0; w<5; w++) {          
00306                     MISSILE missile_record = missile_get_info(w);
00307                     double f;
00308                     f = (int)sqrt(pow((double)(missile_record.x-missileArr[d].source_x),2.0) +  pow((double)(missile_record.y-missileArr[d].y),2.0));              
00309                   
00310                          if((f<radius) && (missile_record.status == MISSILE_ACTIVE) && (missileArr[d].status== PLAYER_MISSILE_ACTIVE)) {
00311                                  for (int j=0; j< (radius+1); j = j+3) {
00312                                      uLCD.circle(missile_record.x, missile_record.y, j, 0xFFFF00);
00313                                                                          
00314                                      } 
00315                                      for (int j=0; j<(radius+1); j=j+3) {
00316                                          uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR);
00317                                          
00318                                          }
00319                                  missile_set_exploded(w);
00320                                  
00321                                  player_set_exploded(d);
00322                                  playSound("/sd/wavfiles/hit.wav");
00323                                  s= s+1;
00324                                  
00325                                  if (s==10 ) {
00326                                       while(1) {
00327                                         uLCD.filled_rectangle(0, 0, 128, 128, 0x000000);
00328                                         uLCD.locate(4, 5);
00329                                         uLCD.printf("Level 2!! \n \n");
00330                                         uLCD.printf("Incoming missiles are faster!");   
00331                                                                            
00332                                         wait(5);
00333                                         uLCD.locate(4,5);
00334                                         uLCD.color(0x000000);
00335                                         uLCD.printf("Level 2!! \n \n");
00336                                         uLCD.printf("Incoming missiles are faster!");  
00337                                         break;
00338                                         }
00339                                      city_landscape_init(4); 
00340                                      set_missile_speed(3);
00341                                      player_draw(player.x,100);
00342                                      
00343                                      }
00344                                      
00345                                 
00346                     }
00347                 
00348               }
00349               
00350         }
00351                                      
00352                                  
00353             
00354             
00355         }
00356     }
00357 
00358 
00359 
00360 void playSound(char * wav) {
00361     // open wav file
00362     FILE *wave_file;
00363     wave_file=fopen(wav,"r");
00364 
00365     // play wav file
00366     waver.play(wave_file);
00367 
00368     // close wav file
00369     fclose(wave_file);
00370 }
00371