Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Fri Aug 5 2022 06:55:07 by
1.7.2