Ben Evans University Second Year Project. Game Called Defender.
Embed:
(wiki syntax)
Show/hide line numbers
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