Ben Evans / Mbed 2 deprecated Defender_Game

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PlayEngine.cpp Source File

PlayEngine.cpp

00001 #include "PlayEngine.h"
00002 
00003 // Spaceship control -----------------------------------------------------------
00004 
00005 void PlayEngine::read_joystick_direction() {
00006     d_ = pad.get_direction();
00007 }
00008 
00009 void PlayEngine::read_accelerometer_direction(float roll,float pitch) {  
00010     // printf("Pitch = %f  Roll = %f\n", pitch, roll);  
00011      
00012     // North
00013     if (pitch >= -35) {
00014         if (roll >= 10) {
00015             d_ = NE;
00016         }else if (roll <= -10) {
00017             d_ = NW;
00018         }else {
00019             d_ = N;
00020         }
00021     // South
00022     }else if (pitch <= -55) {
00023         if (roll >= 10) {
00024             d_ = SE;
00025         }else if (roll <= -10) {
00026             d_ = SW;
00027         }else {
00028             d_ = S; 
00029         }
00030     // East/west
00031     }else {
00032         if (roll >= 10) {
00033             d_ = E;
00034         }else if (roll <= -10) {
00035             d_ = W;
00036         }else{
00037             d_ = CENTRE;
00038         }
00039     }      
00040 }
00041 
00042 void PlayEngine::spaceship_lives_leds() {
00043     pad.leds_off(); 
00044     
00045     // Top two red leds on if 1 lives left
00046     if (spaceship_lives_ >= 1) {
00047         pad.led(1,1); 
00048         pad.led(4,1);
00049     }
00050     
00051     // Middle two orange leds also on if 2 lives left
00052     if (spaceship_lives_ >= 2) {
00053         pad.led(2,1);
00054         pad.led(5,1);
00055     }
00056     
00057     // Bottom two red leds also on if 3 lives left
00058     if (spaceship_lives_ == 3) {
00059         pad.led(3,1);
00060         pad.led(6,1);
00061     }
00062 }
00063 
00064 
00065 
00066 
00067 // Weapon control --------------------------------------------------------------
00068 
00069 void PlayEngine::create_weapons_bullets() {
00070     // Controlls speed that bullet can be fired
00071     if (pad.A_pressed() && bullet_timer_ <=0) {
00072         // Bullet object
00073         Weapons new_bullet;
00074             
00075         new_bullet.init(spaceship.get_pos(), 
00076         spaceship.get_spaceship_sprite_direction(), true);
00077             
00078         // Stores bullet object in vector 
00079         bullet_vector.push_back(new_bullet);
00080         bullet_timer_ =  10; 
00081     }
00082     bullet_timer_--;   
00083 }
00084 
00085 void PlayEngine::create_weapons_smart_bomb() {  
00086     if (pad.B_pressed() && smart_bomb_counter_ > 0 && smart_bomb_timer_ <=0) {
00087         weapons.smart_bomb(lcd);
00088         smart_bomb_counter_--;
00089             
00090         // Deletes alien object if on screen and person object if abducted
00091         for (int i = (alien_vector.size() -1) ; i >= 0 ; i--) {
00092             Vector2D alien_pos = alien_vector[i].get_pos(); 
00093             
00094             // Creats explosion if alien was on the screen    
00095             if(alien_pos.x <= 84 && alien_pos.x >= -6){
00096                 create_explosion(alien_pos); 
00097                 
00098                 // Delete person object if was being abducted by destroyed alien
00099                 if(alien_vector[i].get_collision_people_element() > -1){
00100                     people_vector.erase(people_vector.begin() + 
00101                     alien_vector[i].get_collision_people_element()); 
00102                 } 
00103                 
00104                 alien_vector.erase(alien_vector.begin()+ i);
00105                 points_ ++;  
00106             }  
00107         }
00108     
00109     // Timer to stop smart bomb button be accidently pressed twice or spammed 
00110     smart_bomb_timer_ =  30;   
00111     } 
00112     smart_bomb_timer_--;
00113 }
00114 
00115 void PlayEngine::draw_bullets() {
00116     // Interates over bullet vectors, moves and draws bullet objects
00117     
00118     // Alien bullets
00119     for (int i = 0; i < alien_bullet_vector.size(); i++) {
00120         alien_bullet_vector[i].draw_alien_bullet(lcd, d_);
00121         
00122         // Deletes alien bullet object after bullet has moved set distance   
00123         if (alien_bullet_vector[i].get_bullet_delete_counter() >> 5) {
00124              alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);
00125         }
00126         
00127         // Deletes bullet and spaceship if collision detected
00128         if (spaceship.check_collision(alien_bullet_vector[i]) && 
00129         !spaceship_destroyed_ ) {
00130             create_explosion(spaceship.get_pos());
00131             spaceship_destroyed_ = true;
00132             alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);     
00133         }
00134     }
00135     
00136     // Spaceship bullets 
00137     for (int i = 0; i < bullet_vector.size(); i++) {
00138         bullet_vector[i].draw_bullet(lcd);
00139          
00140         // Deletes bullet object after bullet has moved set distance   
00141         if (bullet_vector[i].get_bullet_delete_counter() >> 5) {
00142              bullet_vector.erase(bullet_vector.begin()+ i);
00143         }
00144     }
00145 }
00146 
00147 
00148 
00149 
00150 // Alien Control ---------------------------------------------------------------
00151 
00152 void PlayEngine::spawn_aliens() {
00153     if (alien_vector.size() <= alien_number_) {
00154         create_alien();
00155     }
00156     
00157     // printf( " alien_number_counter_ = %d\n",alien_number_counter_);
00158     
00159     // Slowly increasing the alien counter as game goes on to make harder
00160     if (spawn_alien_counter_%(375*spawn_time_multipler_) ==  0) {
00161         alien_number_++;
00162         spawn_time_multipler_*= 1.2;  
00163         
00164         // printf("alien_number_ %d\n",alien_number_);   
00165     }
00166     
00167     spawn_alien_counter_++;
00168 }
00169 
00170 void PlayEngine::create_alien() {
00171     int position_x_start = 0;
00172     
00173     // Alien object
00174     Alien new_alien;
00175     
00176     // Spawns aliens between x > 84 and x <0
00177     if (rand() % 2) {
00178         position_x_start = rand() % 84 + 84;
00179     }else{
00180         position_x_start =rand() % 83 - 84;
00181     } 
00182     new_alien.init(pad, position_x_start, (rand() % 33 + 9));
00183     
00184     // Stores alien object in vector 
00185     alien_vector.push_back(new_alien);
00186 }
00187 
00188 void PlayEngine::check_alien_people_collision(int i) {
00189     // Only a collision if all three of theses conditions are met:
00190     // Checks all these condition for every alien to every person
00191     // 1)person hasn't already had a collision
00192     // 2)There is an actual collision of people and alien
00193     for (int x = 0; x < people_vector.size(); x++) {
00194         if (!people_vector[x].get_alien_collision_flag() &&
00195             people_vector[x].check_alien_collision(alien_vector[i])) {  
00196             alien_vector[i].set_collision_people_element(x); 
00197         }
00198     }
00199     
00200     // Draws collision if detected
00201     if (alien_vector[i].get_collision_people_element() > -1) {
00202         alien_vector[i].draw_alien(lcd,spaceship.get_pos(),d_, 
00203         map.get_length_map(), map.get_position_x_map(),true);
00204     }else{
00205         alien_vector[i].draw_alien(lcd,spaceship.get_pos(),d_, 
00206         map.get_length_map(), map.get_position_x_map(),false);
00207     }    
00208 }
00209 
00210 void PlayEngine::alliens_fire_bullets(int i) {
00211     if (alien_vector[i].get_alien_fire_counter()%60 == 0) {
00212         Weapons alien_bullet;
00213             
00214         // Fires bullet towards direction of spaceship
00215         bool alien_bullet_direction = false;
00216         Vector2D spaceship_pos = spaceship.get_pos();
00217         Vector2D alien_pos = alien_vector[i].get_pos();
00218         if (spaceship_pos.x > alien_pos.x) {
00219             alien_bullet_direction = true;
00220         }
00221             
00222         alien_bullet.init(alien_vector[i].get_pos(), 
00223         alien_bullet_direction , false);
00224         
00225         // Stores bullet object in vector 
00226         alien_bullet_vector.push_back(alien_bullet); 
00227     }   
00228 }
00229 
00230 void PlayEngine::delete_aliens(int i) {
00231     for (int x = 0; x < bullet_vector.size(); x++) {
00232         if (alien_vector[i].check_collision(bullet_vector[x])){
00233             create_explosion(alien_vector[i].get_pos());
00234                 
00235             //Delete person object if was carried by destroyed alien
00236             if(alien_vector[i].get_collision_people_element() > -1){
00237                 people_vector.erase(people_vector.begin() + 
00238                 alien_vector[i].get_collision_people_element()); 
00239             }
00240             
00241             bullet_vector.erase(bullet_vector.begin()+ x);    
00242             alien_vector.erase(alien_vector.begin()+ i);  
00243             points_ ++;   
00244         }
00245     }   
00246 }
00247 
00248 void PlayEngine::draw_aliens() {
00249     // Integrates over alien vector and draws each new_alien object 
00250     for (int i = 0; i < alien_vector.size(); i++) {
00251         
00252         check_alien_people_collision(i);
00253         
00254         // Deleted spaceship if alien ship touches spaceship
00255         if (spaceship.check_alien_collision(alien_vector[i]) && 
00256         !spaceship_destroyed_) {
00257             create_explosion(spaceship.get_pos());
00258             spaceship_destroyed_ = true;  
00259         }
00260         
00261         alliens_fire_bullets(i);
00262         
00263         delete_aliens(i);
00264     }
00265 }
00266 
00267 
00268 
00269 
00270 // Explosion Control -----------------------------------------------------------   
00271 
00272 void PlayEngine::create_explosion(Vector2D destroyed_position) {
00273     // Explosion object
00274     Explosion new_explosion;
00275     
00276     new_explosion.init(destroyed_position);
00277     
00278     // Stores explosion object in vector 
00279     explosion_vector.push_back(new_explosion);
00280     
00281     
00282     // Plays explosion sound if sound fx on
00283     if (sound_fx_ == on) {
00284         pad.tone(40,0.1);
00285         // printf("playing Explosion\n");
00286     }
00287 }
00288 
00289 void PlayEngine::draw_explosions() {
00290     // Integrates over explosion vector and draws each explosion object 
00291     // then deleted object after set size
00292     for (int i = 0; i < explosion_vector.size(); i++) {
00293         explosion_vector[i].draw_explosion(lcd);
00294         
00295         // Delete explosion after reaches set size
00296         if (explosion_vector[i].get_explosion_radius() == 8) {
00297              explosion_vector.erase(explosion_vector.begin()+ i);    
00298         }
00299     }
00300 }
00301 
00302 
00303 
00304 
00305 // People Control --------------------------------------------------------------
00306 
00307 void PlayEngine::spawn_people() {
00308     // Keeps number of people objects constant as people objects are erased
00309     if (people_vector.size() <= 5) {
00310         create_people();
00311     }
00312 }
00313 
00314 void PlayEngine::create_people() {
00315     // People object
00316     People people;
00317     
00318     people.init(pad, (rand() % 168 - 84));
00319     
00320     // Stores alien object in vector 
00321     people_vector.push_back(people);
00322 }
00323 
00324 void PlayEngine::draw_people() {
00325     for (int i = 0; i < people_vector.size(); i++) {
00326         people_vector[i].draw_people(lcd, d_, 
00327         map.get_length_map(), map.get_position_x_map());  
00328         
00329         // Erase person if at top of screen as captured by alien and alien is 
00330         // set to track mode
00331         Vector2D people_pos =  people_vector[i].get_pos();
00332         for (int x = 0; x < alien_vector.size(); x++) {
00333             Vector2D alien_pos = alien_vector[x].get_pos();
00334             if (people_pos.y < 30 && alien_pos.y < 9 &&
00335             alien_vector[x].get_collision_people_element() == i) {
00336                     
00337                 // Set alien who abducted person to track mode
00338                 alien_vector[x].set_track_flag(true);
00339                 people_vector.erase(people_vector.begin()+ i);   
00340             }  
00341            
00342         }
00343     }
00344 }
00345 
00346 
00347 
00348 
00349 // Map Control------------------------------------------------------------------
00350 
00351 void PlayEngine::reset_map_timer() {
00352     if (spaceship_destroyed_) {
00353         reset_map_counter_++; 
00354         
00355         // Stops map movement
00356         d_ = CENTRE;
00357         
00358         // Reset map after set time
00359         if (reset_map_counter_ == 50) {
00360             reset_map();
00361         }
00362     }   
00363 }
00364    
00365 void PlayEngine::reset_map() {
00366     // Reassign values to variables
00367     spaceship.init();
00368     spaceship_lives_--;
00369     spaceship_destroyed_ = false;
00370     reset_map_counter_ = 0;
00371     
00372     // Erase aliens so redrawn in random positions when respawning spaceship
00373     for (int i = (alien_vector.size() - 1); i >= 0 ; i--) {
00374         alien_vector.erase(alien_vector.begin()+ i);  
00375     }
00376     
00377     // Erase all people so redrawn at bottom of map
00378     for (int i = (people_vector.size() - 1); i >= 0 ; i--) {
00379          people_vector.erase(people_vector.begin()+ i);      
00380     }
00381     
00382     // Erase all alien bullets
00383     for (int i = (alien_bullet_vector.size() - 1); i >= 0 ; i--) {
00384          alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);      
00385     }
00386 }