Ben Evans / Mbed 2 deprecated Defender_Game

Dependencies:   mbed

Committer:
evanso
Date:
Tue May 19 19:36:56 2020 +0000
Revision:
56:663d0546c235
Parent:
55:c04568b25617
Child:
57:d4ce42c24561
Added pause screen that can excite or save and excite from playable part of game

Who changed what in which revision?

UserRevisionLine numberNew contents of line
evanso 8:dd1037c5435b 1 #include "GameEngine.h"
evanso 47:49fa1adc10b4 2
evanso 47:49fa1adc10b4 3 /** Define acelleromter object */
evanso 47:49fa1adc10b4 4 FXOS8700CQ accelerometer(I2C_SDA,I2C_SCL);
evanso 8:dd1037c5435b 5
evanso 49:ed569eceeaa4 6 /** Define SD card object */
evanso 49:ed569eceeaa4 7 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");
evanso 49:ed569eceeaa4 8
evanso 8:dd1037c5435b 9 GameEngine::GameEngine() {
evanso 44:2d957de3bce3 10 //attach ticker to isr
evanso 42:3aed75338272 11 ticker.attach(callback(this, &GameEngine::lcd_frame_time_isr), 0.04 );
evanso 8:dd1037c5435b 12 }
evanso 8:dd1037c5435b 13
evanso 8:dd1037c5435b 14 GameEngine::~GameEngine() {
evanso 8:dd1037c5435b 15
evanso 8:dd1037c5435b 16 }
evanso 8:dd1037c5435b 17
evanso 13:12276eed13ac 18 void GameEngine::init() {
evanso 36:27aa597db3d2 19 // Initalise objects
evanso 8:dd1037c5435b 20 pad.init();
evanso 8:dd1037c5435b 21 lcd.init();
evanso 8:dd1037c5435b 22 spaceship.init();
evanso 13:12276eed13ac 23 map.init(pad);
evanso 40:71f947254fda 24 menu.init();
evanso 47:49fa1adc10b4 25 accelerometer.init();
evanso 36:27aa597db3d2 26
evanso 36:27aa597db3d2 27 // Set seed value
evanso 36:27aa597db3d2 28 srand(pad.read_adc()*64000);
evanso 36:27aa597db3d2 29
evanso 36:27aa597db3d2 30 // Assign values to variables
evanso 45:fc3238cd28c6 31 spawn_time_multipler_ = 1;
evanso 51:35cb8e604b72 32 alien_number_ = 3;
evanso 45:fc3238cd28c6 33 spawn_alien_counter_ = 0;
evanso 45:fc3238cd28c6 34 spaceship_lives_ = 3;
evanso 45:fc3238cd28c6 35 spaceship_destroyed_ = false;
evanso 45:fc3238cd28c6 36 reset_map_counter_ = 0;
evanso 45:fc3238cd28c6 37 smart_bomb_counter_ = 4;
evanso 33:7fedd8029473 38 create_people();
evanso 45:fc3238cd28c6 39 points_ = 0;
evanso 45:fc3238cd28c6 40 smart_bomb_timer_ = 0;
evanso 45:fc3238cd28c6 41 bullet_timer_ = 0;
evanso 41:5959256f4aab 42 current_menu_part_= menu.get_current_menu_part();
evanso 45:fc3238cd28c6 43 lcd_frame_time_flag_ = 0;
evanso 56:663d0546c235 44 paused_flag_ = false;
evanso 56:663d0546c235 45 exit_flag_ = false;
evanso 8:dd1037c5435b 46 }
evanso 8:dd1037c5435b 47
evanso 44:2d957de3bce3 48 // Menu Control-----------------------------------------------------------------
evanso 44:2d957de3bce3 49
evanso 44:2d957de3bce3 50 void GameEngine::game_select_part(){
evanso 44:2d957de3bce3 51 switch (current_menu_part_) {
evanso 44:2d957de3bce3 52 case main_menu: run_menu(); break;
evanso 44:2d957de3bce3 53 case play: run_play(); break;
evanso 44:2d957de3bce3 54 case settings: run_settings(); break;
evanso 44:2d957de3bce3 55 case saved_games: run_saved_games(); break;
evanso 44:2d957de3bce3 56 }
evanso 44:2d957de3bce3 57 }
evanso 44:2d957de3bce3 58
evanso 44:2d957de3bce3 59 void GameEngine::run_menu(){
evanso 44:2d957de3bce3 60 lcd.setContrast(pad.read_pot1());
evanso 44:2d957de3bce3 61 lcd.clear();
evanso 44:2d957de3bce3 62
evanso 44:2d957de3bce3 63 // Scrolls, draws and selcts menu parts
evanso 44:2d957de3bce3 64 read_joystick_direction();
evanso 44:2d957de3bce3 65 menu.menu_scroll(pad, d_);
evanso 44:2d957de3bce3 66 menu.draw_part(lcd);
evanso 44:2d957de3bce3 67 menu.select_part(lcd, pad);
evanso 44:2d957de3bce3 68
evanso 44:2d957de3bce3 69 current_menu_part_ = menu.get_current_menu_part();
evanso 44:2d957de3bce3 70
evanso 44:2d957de3bce3 71 lcd.refresh();
evanso 44:2d957de3bce3 72 }
evanso 44:2d957de3bce3 73
evanso 44:2d957de3bce3 74 void GameEngine::run_play(){
evanso 44:2d957de3bce3 75 while (1) {
evanso 44:2d957de3bce3 76 // Checks flag and prints spaceship on lcd then resets flag
evanso 45:fc3238cd28c6 77 if (lcd_frame_time_flag_) {
evanso 44:2d957de3bce3 78 // resets ISR flag
evanso 45:fc3238cd28c6 79 lcd_frame_time_flag_ = 0;
evanso 44:2d957de3bce3 80
evanso 56:663d0546c235 81 //Pause screen
evanso 56:663d0546c235 82 if (paused_flag_ || pad.start_pressed()){
evanso 56:663d0546c235 83 run_paused_game();
evanso 56:663d0546c235 84 }else{
evanso 56:663d0546c235 85 gameplay_loop();
evanso 56:663d0546c235 86 }
evanso 44:2d957de3bce3 87
evanso 44:2d957de3bce3 88 // break out of game loop when lives = 0
evanso 45:fc3238cd28c6 89 if(!spaceship_lives_){
evanso 56:663d0546c235 90 //game over screen then back to menu
evanso 56:663d0546c235 91 lcd.clear();
evanso 56:663d0546c235 92 lcd.printString("Game Over",15,3);
evanso 56:663d0546c235 93 lcd.refresh();
evanso 56:663d0546c235 94 wait(3);
evanso 56:663d0546c235 95 current_menu_part_ = main_menu;
evanso 56:663d0546c235 96 break;
evanso 44:2d957de3bce3 97 }
evanso 56:663d0546c235 98
evanso 56:663d0546c235 99 //Returns to mainmenu if exit slected in pause screen
evanso 56:663d0546c235 100 if(exit_flag_){
evanso 56:663d0546c235 101 break;
evanso 56:663d0546c235 102 }
evanso 44:2d957de3bce3 103 }
evanso 44:2d957de3bce3 104
evanso 44:2d957de3bce3 105 // MCU put to sleep between each frame to save power
evanso 44:2d957de3bce3 106 sleep();
evanso 44:2d957de3bce3 107 }
evanso 51:35cb8e604b72 108
evanso 56:663d0546c235 109
evanso 56:663d0546c235 110
evanso 44:2d957de3bce3 111 }
evanso 44:2d957de3bce3 112
evanso 13:12276eed13ac 113 void GameEngine::gameplay_loop() {
evanso 30:814674b189f0 114 // clear screen and set contrast
evanso 13:12276eed13ac 115 lcd.setContrast(pad.read_pot1());
evanso 8:dd1037c5435b 116 lcd.clear();
evanso 11:ab578a151f67 117
evanso 41:5959256f4aab 118 // creat objects
evanso 41:5959256f4aab 119 spawn_aliens();
evanso 41:5959256f4aab 120 spawn_people();
evanso 41:5959256f4aab 121
evanso 41:5959256f4aab 122 //If spaceship is destroyed stop joystick input, dont draw spaceship sprite
evanso 45:fc3238cd28c6 123 if (!spaceship_destroyed_){
evanso 47:49fa1adc10b4 124 //read_joystick_direction();
evanso 47:49fa1adc10b4 125 read_accelerometer_direction();
evanso 41:5959256f4aab 126 spaceship.movement(d_);
evanso 41:5959256f4aab 127 spaceship.draw(lcd);
evanso 47:49fa1adc10b4 128 create_weapons_bullets();
evanso 47:49fa1adc10b4 129 create_weapons_smart_bomb();
evanso 41:5959256f4aab 130 }
evanso 41:5959256f4aab 131
evanso 41:5959256f4aab 132 // Draws objects
evanso 41:5959256f4aab 133 map.draw_map(lcd, d_);
evanso 41:5959256f4aab 134 draw_aliens();
evanso 41:5959256f4aab 135 draw_bullets();
evanso 41:5959256f4aab 136 draw_explosions();
evanso 41:5959256f4aab 137 draw_people();
evanso 45:fc3238cd28c6 138 hud.draw_HUD(lcd, spaceship_lives_, points_, smart_bomb_counter_);
evanso 41:5959256f4aab 139 spaceship_lives_leds();
evanso 41:5959256f4aab 140
evanso 41:5959256f4aab 141 reset_map_timer();
evanso 30:814674b189f0 142
evanso 56:663d0546c235 143
evanso 18:11068b98e261 144 // refresh's screen
evanso 18:11068b98e261 145 lcd.refresh();
evanso 13:12276eed13ac 146 }
evanso 13:12276eed13ac 147
evanso 41:5959256f4aab 148 void GameEngine::run_settings(){
evanso 41:5959256f4aab 149
evanso 41:5959256f4aab 150 }
evanso 41:5959256f4aab 151
evanso 41:5959256f4aab 152 void GameEngine::run_saved_games(){
evanso 41:5959256f4aab 153
evanso 41:5959256f4aab 154 }
evanso 41:5959256f4aab 155
evanso 56:663d0546c235 156 void GameEngine::run_paused_game(){
evanso 56:663d0546c235 157 draw_pause_screen();
evanso 56:663d0546c235 158 paused_flag_ = true;
evanso 56:663d0546c235 159
evanso 56:663d0546c235 160 //Exit
evanso 56:663d0546c235 161 if (pad.A_pressed()){
evanso 56:663d0546c235 162 current_menu_part_ = main_menu;
evanso 56:663d0546c235 163 exit_flag_ = true;
evanso 56:663d0546c235 164 }
evanso 56:663d0546c235 165
evanso 56:663d0546c235 166 //Save&Exit
evanso 56:663d0546c235 167 if (pad.B_pressed()){
evanso 56:663d0546c235 168 //Define struct data
evanso 56:663d0546c235 169 SavedGamesData data;
evanso 56:663d0546c235 170
evanso 56:663d0546c235 171 //Set values in struct data
evanso 56:663d0546c235 172 data.score = points_;
evanso 56:663d0546c235 173 data.lives = spaceship_lives_;
evanso 56:663d0546c235 174 data.smart_bombs = smart_bomb_counter_;
evanso 56:663d0546c235 175 data.alien_number = alien_number_;
evanso 56:663d0546c235 176
evanso 56:663d0546c235 177 //save game data to file
evanso 56:663d0546c235 178 saved.add_saved_data(sd, data, lcd);
evanso 56:663d0546c235 179
evanso 56:663d0546c235 180 current_menu_part_ = main_menu;
evanso 56:663d0546c235 181 exit_flag_ = true;
evanso 56:663d0546c235 182 }
evanso 56:663d0546c235 183
evanso 56:663d0546c235 184 if (pad.start_pressed()){
evanso 56:663d0546c235 185 paused_flag_ = false;
evanso 56:663d0546c235 186 }
evanso 56:663d0546c235 187 }
evanso 56:663d0546c235 188
evanso 56:663d0546c235 189 void GameEngine::draw_pause_screen(){
evanso 56:663d0546c235 190 // clear screen and set contrast
evanso 56:663d0546c235 191 lcd.setContrast(pad.read_pot1());
evanso 56:663d0546c235 192 lcd.clear();
evanso 56:663d0546c235 193
evanso 56:663d0546c235 194 //Draw strings
evanso 56:663d0546c235 195 lcd.printString("Paused!",24,0);
evanso 56:663d0546c235 196 lcd.printString("A to Exit",15,2);
evanso 56:663d0546c235 197 lcd.printString("B to Save&Exit",0,4);
evanso 56:663d0546c235 198
evanso 56:663d0546c235 199 // refresh's screen
evanso 56:663d0546c235 200 lcd.refresh();
evanso 56:663d0546c235 201 }
evanso 56:663d0546c235 202
evanso 42:3aed75338272 203 void GameEngine::lcd_frame_time_isr(){
evanso 42:3aed75338272 204 // set ISR flag
evanso 45:fc3238cd28c6 205 lcd_frame_time_flag_ = 1;
evanso 42:3aed75338272 206 }
evanso 42:3aed75338272 207
evanso 39:fc5586b930e3 208 //Spaceship control ------------------------------------------------------------
evanso 39:fc5586b930e3 209
evanso 15:90b6821bcf64 210 void GameEngine::read_joystick_direction(){
evanso 13:12276eed13ac 211 d_ = pad.get_direction();
evanso 18:11068b98e261 212 }
evanso 18:11068b98e261 213
evanso 47:49fa1adc10b4 214 void GameEngine::read_accelerometer_direction(){
evanso 47:49fa1adc10b4 215 float roll = accelerometer.get_roll_angle();
evanso 47:49fa1adc10b4 216 float pitch = accelerometer.get_pitch_angle();
evanso 47:49fa1adc10b4 217 // printf("Pitch = %f Roll = %f\n", pitch, roll);
evanso 47:49fa1adc10b4 218
evanso 47:49fa1adc10b4 219 //north
evanso 47:49fa1adc10b4 220 if(pitch >= -35){
evanso 47:49fa1adc10b4 221 if(roll >= 10){
evanso 47:49fa1adc10b4 222 d_ = NE;
evanso 47:49fa1adc10b4 223 }else if (roll <= -10){
evanso 47:49fa1adc10b4 224 d_ = NW;
evanso 47:49fa1adc10b4 225 }else {
evanso 47:49fa1adc10b4 226 d_ = N;
evanso 47:49fa1adc10b4 227 }
evanso 47:49fa1adc10b4 228 //south
evanso 47:49fa1adc10b4 229 }else if(pitch <= -55){
evanso 47:49fa1adc10b4 230 if (roll >= 10){
evanso 47:49fa1adc10b4 231 d_ = SE;
evanso 47:49fa1adc10b4 232 }else if(roll <= -10){
evanso 47:49fa1adc10b4 233 d_ = SW;
evanso 47:49fa1adc10b4 234 }else {
evanso 47:49fa1adc10b4 235 d_ = S;
evanso 47:49fa1adc10b4 236 }
evanso 47:49fa1adc10b4 237 // East/west
evanso 47:49fa1adc10b4 238 }else {
evanso 47:49fa1adc10b4 239 if (roll >= 10){
evanso 47:49fa1adc10b4 240 d_ = E;
evanso 47:49fa1adc10b4 241 }else if(roll <= -10){
evanso 47:49fa1adc10b4 242 d_ = W;
evanso 47:49fa1adc10b4 243 }else{
evanso 47:49fa1adc10b4 244 d_ = CENTRE;
evanso 47:49fa1adc10b4 245 }
evanso 47:49fa1adc10b4 246 }
evanso 47:49fa1adc10b4 247 }
evanso 47:49fa1adc10b4 248
evanso 39:fc5586b930e3 249 void GameEngine::spaceship_lives_leds(){
evanso 39:fc5586b930e3 250 pad.leds_off();
evanso 39:fc5586b930e3 251
evanso 39:fc5586b930e3 252 //top two red leds on if 1 lives left
evanso 45:fc3238cd28c6 253 if(spaceship_lives_ >= 1){
evanso 39:fc5586b930e3 254 pad.led(1,1);
evanso 39:fc5586b930e3 255 pad.led(4,1);
evanso 39:fc5586b930e3 256 }
evanso 39:fc5586b930e3 257
evanso 39:fc5586b930e3 258 //middle two orange leds also on if 2 lives left
evanso 45:fc3238cd28c6 259 if(spaceship_lives_ >= 2){
evanso 39:fc5586b930e3 260 pad.led(2,1);
evanso 39:fc5586b930e3 261 pad.led(5,1);
evanso 39:fc5586b930e3 262 }
evanso 39:fc5586b930e3 263
evanso 39:fc5586b930e3 264 //bottom two red leds also on if 3 lives left
evanso 45:fc3238cd28c6 265 if(spaceship_lives_ == 3){
evanso 39:fc5586b930e3 266 pad.led(3,1);
evanso 39:fc5586b930e3 267 pad.led(6,1);
evanso 39:fc5586b930e3 268 }
evanso 39:fc5586b930e3 269 }
evanso 39:fc5586b930e3 270
evanso 44:2d957de3bce3 271
evanso 44:2d957de3bce3 272
evanso 36:27aa597db3d2 273 //Weapon control ---------------------------------------------------------------
evanso 36:27aa597db3d2 274
evanso 36:27aa597db3d2 275 void GameEngine::create_weapons_bullets(){
evanso 39:fc5586b930e3 276 // controlls speed that bullet can be fired
evanso 45:fc3238cd28c6 277 if(bullet_timer_ <=0){
evanso 39:fc5586b930e3 278 if (pad.A_pressed()){
evanso 36:27aa597db3d2 279 // Bullet object
evanso 36:27aa597db3d2 280 Weapons new_bullet;
evanso 36:27aa597db3d2 281
evanso 36:27aa597db3d2 282 new_bullet.init(spaceship.get_pos(),
evanso 36:27aa597db3d2 283 spaceship.get_spaceship_sprite_direction(), true);
evanso 36:27aa597db3d2 284
evanso 36:27aa597db3d2 285 // Stores bullet object in vector
evanso 36:27aa597db3d2 286 bullet_vector.push_back(new_bullet);
evanso 39:fc5586b930e3 287 }
evanso 45:fc3238cd28c6 288 bullet_timer_ = 5;
evanso 39:fc5586b930e3 289 }
evanso 45:fc3238cd28c6 290 bullet_timer_--;
evanso 36:27aa597db3d2 291 }
evanso 36:27aa597db3d2 292
evanso 36:27aa597db3d2 293 void GameEngine::create_weapons_smart_bomb(){
evanso 39:fc5586b930e3 294 // timer to stop smart bomb button be accidently pressed twice
evanso 45:fc3238cd28c6 295 if(smart_bomb_timer_ <=0){
evanso 45:fc3238cd28c6 296 if (pad.B_pressed() && smart_bomb_counter_ > 0){
evanso 39:fc5586b930e3 297 weapons.smart_bomb(lcd);
evanso 45:fc3238cd28c6 298 smart_bomb_counter_--;
evanso 39:fc5586b930e3 299
evanso 39:fc5586b930e3 300 //Deletes alien object if on screen
evanso 39:fc5586b930e3 301 for (int i = (alien_vector.size() -1) ; i >= 0 ; i--){
evanso 39:fc5586b930e3 302 Vector2D alien_pos = alien_vector[i].get_pos();
evanso 36:27aa597db3d2 303
evanso 39:fc5586b930e3 304 // Creats explosion if alien was on the screen
evanso 39:fc5586b930e3 305 if(alien_pos.x <= 84 && alien_pos.x >= -6){
evanso 39:fc5586b930e3 306 create_explosion(alien_pos);
evanso 39:fc5586b930e3 307
evanso 39:fc5586b930e3 308 //delete person object if was being abducted by destroyed alien
evanso 39:fc5586b930e3 309 if(alien_vector[i].get_collision_people_element() > -1){
evanso 39:fc5586b930e3 310 people_vector.erase(people_vector.begin() +
evanso 39:fc5586b930e3 311 alien_vector[i].get_collision_people_element());
evanso 39:fc5586b930e3 312 }
evanso 39:fc5586b930e3 313
evanso 39:fc5586b930e3 314 alien_vector.erase(alien_vector.begin()+ i);
evanso 45:fc3238cd28c6 315 points_ ++;
evanso 39:fc5586b930e3 316 }
evanso 36:27aa597db3d2 317 }
evanso 45:fc3238cd28c6 318 smart_bomb_timer_ = 30;
evanso 39:fc5586b930e3 319 }
evanso 39:fc5586b930e3 320 }
evanso 45:fc3238cd28c6 321 smart_bomb_timer_--;
evanso 36:27aa597db3d2 322 }
evanso 36:27aa597db3d2 323
evanso 36:27aa597db3d2 324 void GameEngine::draw_bullets(){
evanso 36:27aa597db3d2 325 // interates over bullet vectors, moves and draws bullet objects
evanso 36:27aa597db3d2 326
evanso 36:27aa597db3d2 327 // Alien bullets
evanso 36:27aa597db3d2 328 for (int i = 0; i < alien_bullet_vector.size(); i++){
evanso 36:27aa597db3d2 329 alien_bullet_vector[i].draw_alien_bullet(lcd, d_);
evanso 36:27aa597db3d2 330
evanso 36:27aa597db3d2 331 // deletes alien bullet object after bullet has moved set distance
evanso 36:27aa597db3d2 332 if(alien_bullet_vector[i].get_bullet_delete_counter() >> 5){
evanso 36:27aa597db3d2 333 alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);
evanso 36:27aa597db3d2 334 }
evanso 36:27aa597db3d2 335
evanso 36:27aa597db3d2 336 // Deletes bullet and shpaceship if collision detected
evanso 36:27aa597db3d2 337 if (spaceship.check_collision(alien_bullet_vector[i]) &&
evanso 45:fc3238cd28c6 338 !spaceship_destroyed_ ){
evanso 36:27aa597db3d2 339 create_explosion(spaceship.get_pos());
evanso 36:27aa597db3d2 340
evanso 45:fc3238cd28c6 341 spaceship_destroyed_ = true;
evanso 36:27aa597db3d2 342 alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);
evanso 36:27aa597db3d2 343 }
evanso 36:27aa597db3d2 344 }
evanso 36:27aa597db3d2 345
evanso 36:27aa597db3d2 346 // Spaceship bullets
evanso 36:27aa597db3d2 347 for (int i = 0; i < bullet_vector.size(); i++){
evanso 36:27aa597db3d2 348 bullet_vector[i].draw_bullet(lcd);
evanso 36:27aa597db3d2 349
evanso 36:27aa597db3d2 350 // deletes bullet object after bullet has moved set distance
evanso 36:27aa597db3d2 351 if(bullet_vector[i].get_bullet_delete_counter() >> 5){
evanso 36:27aa597db3d2 352 bullet_vector.erase(bullet_vector.begin()+ i);
evanso 36:27aa597db3d2 353 }
evanso 36:27aa597db3d2 354 }
evanso 36:27aa597db3d2 355 }
evanso 36:27aa597db3d2 356
evanso 36:27aa597db3d2 357
evanso 36:27aa597db3d2 358
evanso 36:27aa597db3d2 359 //Alien Control ----------------------------------------------------------------
evanso 36:27aa597db3d2 360
evanso 32:c006a9882778 361 void GameEngine::spawn_aliens(){
evanso 51:35cb8e604b72 362 if(alien_vector.size() <= alien_number_){
evanso 34:85ccc16f24d2 363 create_alien();
evanso 32:c006a9882778 364 }
evanso 32:c006a9882778 365
evanso 45:fc3238cd28c6 366 //printf( " alien_number_counter_ = %d\n",alien_number_counter_);
evanso 45:fc3238cd28c6 367
evanso 34:85ccc16f24d2 368 //slowley incresing the alien counter as game goes on to make harder
evanso 45:fc3238cd28c6 369 if(spawn_alien_counter_%(500*spawn_time_multipler_) == 0){
evanso 51:35cb8e604b72 370 alien_number_++;
evanso 45:fc3238cd28c6 371 spawn_time_multipler_++;
evanso 32:c006a9882778 372 }
evanso 34:85ccc16f24d2 373
evanso 45:fc3238cd28c6 374 spawn_alien_counter_++;
evanso 32:c006a9882778 375 }
evanso 32:c006a9882778 376
evanso 36:27aa597db3d2 377 void GameEngine::create_alien(){
evanso 36:27aa597db3d2 378 int position_x_start = 0;
evanso 36:27aa597db3d2 379
evanso 36:27aa597db3d2 380 // Alien object
evanso 36:27aa597db3d2 381 Alien new_alien;
evanso 36:27aa597db3d2 382
evanso 36:27aa597db3d2 383 //spawns aliens between x > 84 and x <0
evanso 36:27aa597db3d2 384 if(rand() % 2){
evanso 36:27aa597db3d2 385 position_x_start = rand() % 84 + 84;
evanso 36:27aa597db3d2 386 }else{
evanso 36:27aa597db3d2 387 position_x_start =rand() % 83 - 84;
evanso 36:27aa597db3d2 388 }
evanso 39:fc5586b930e3 389 new_alien.init(pad, position_x_start, (rand() % 33 + 9));
evanso 36:27aa597db3d2 390
evanso 36:27aa597db3d2 391 // Stores alien object in vector
evanso 36:27aa597db3d2 392 alien_vector.push_back(new_alien);
evanso 36:27aa597db3d2 393 }
evanso 36:27aa597db3d2 394
evanso 36:27aa597db3d2 395 void GameEngine::check_alien_people_collision(int i){
evanso 40:71f947254fda 396 // only a collision if all three of theses conditions are met:
evanso 40:71f947254fda 397 // check all these codition for every alien to every person
evanso 40:71f947254fda 398 // 1)person hasn't already had a collision
evanso 40:71f947254fda 399 // 2)There is an acutaual collision of people and alien
evanso 36:27aa597db3d2 400 for (int x = 0; x < people_vector.size(); x++){
evanso 36:27aa597db3d2 401 if (!people_vector[x].get_alien_collision_flag() &&
evanso 36:27aa597db3d2 402 people_vector[x].check_alien_collision(alien_vector[i])){
evanso 36:27aa597db3d2 403 alien_vector[i].set_collision_people_element(x);
evanso 36:27aa597db3d2 404 }
evanso 36:27aa597db3d2 405 }
evanso 36:27aa597db3d2 406
evanso 36:27aa597db3d2 407 //draws collision if detected
evanso 36:27aa597db3d2 408 if(alien_vector[i].get_collision_people_element() > -1){
evanso 36:27aa597db3d2 409 alien_vector[i].draw_alien(lcd,spaceship.get_pos(),d_,
evanso 36:27aa597db3d2 410 map.get_length_map(), map.get_position_x_map(),true);
evanso 36:27aa597db3d2 411 }else{
evanso 36:27aa597db3d2 412 alien_vector[i].draw_alien(lcd,spaceship.get_pos(),d_,
evanso 36:27aa597db3d2 413 map.get_length_map(), map.get_position_x_map(),false);
evanso 36:27aa597db3d2 414 }
evanso 36:27aa597db3d2 415 }
evanso 36:27aa597db3d2 416
evanso 36:27aa597db3d2 417 void GameEngine::alliens_fire_bullets(int i){
evanso 36:27aa597db3d2 418 if (alien_vector[i].get_alien_fire_counter()%60 == 0){
evanso 36:27aa597db3d2 419 Weapons alien_bullet;
evanso 36:27aa597db3d2 420
evanso 36:27aa597db3d2 421 // fires bullet towards direction of spaceship
evanso 36:27aa597db3d2 422 bool alien_bullet_direction = false;
evanso 36:27aa597db3d2 423 Vector2D spaceship_pos = spaceship.get_pos();
evanso 36:27aa597db3d2 424 Vector2D alien_pos = alien_vector[i].get_pos();
evanso 36:27aa597db3d2 425 if(spaceship_pos.x > alien_pos.x){
evanso 36:27aa597db3d2 426 alien_bullet_direction = true;
evanso 36:27aa597db3d2 427 }
evanso 36:27aa597db3d2 428
evanso 36:27aa597db3d2 429 alien_bullet.init(alien_vector[i].get_pos(),
evanso 36:27aa597db3d2 430 alien_bullet_direction , false);
evanso 36:27aa597db3d2 431
evanso 36:27aa597db3d2 432 // Stores bullet object in vector
evanso 36:27aa597db3d2 433 alien_bullet_vector.push_back(alien_bullet);
evanso 36:27aa597db3d2 434 }
evanso 36:27aa597db3d2 435 }
evanso 36:27aa597db3d2 436
evanso 36:27aa597db3d2 437 void GameEngine::delete_aliens(int i){
evanso 36:27aa597db3d2 438 for (int x = 0; x < bullet_vector.size(); x++){
evanso 36:27aa597db3d2 439 if (alien_vector[i].check_collision(bullet_vector[x])){
evanso 36:27aa597db3d2 440 create_explosion(alien_vector[i].get_pos());
evanso 36:27aa597db3d2 441
evanso 36:27aa597db3d2 442 //delete person object if was carried by destroyed alien
evanso 36:27aa597db3d2 443 if(alien_vector[i].get_collision_people_element() > -1){
evanso 36:27aa597db3d2 444 people_vector.erase(people_vector.begin() +
evanso 36:27aa597db3d2 445 alien_vector[i].get_collision_people_element());
evanso 36:27aa597db3d2 446 }
evanso 36:27aa597db3d2 447
evanso 39:fc5586b930e3 448 bullet_vector.erase(bullet_vector.begin()+ x);
evanso 39:fc5586b930e3 449 alien_vector.erase(alien_vector.begin()+ i);
evanso 45:fc3238cd28c6 450 points_ ++;
evanso 36:27aa597db3d2 451 }
evanso 36:27aa597db3d2 452 }
evanso 36:27aa597db3d2 453 }
evanso 36:27aa597db3d2 454
evanso 36:27aa597db3d2 455 void GameEngine::draw_aliens(){
evanso 36:27aa597db3d2 456 // interates over alien vector and draws each new_alien object
evanso 36:27aa597db3d2 457 for (int i = 0; i < alien_vector.size(); i++){
evanso 36:27aa597db3d2 458
evanso 36:27aa597db3d2 459 check_alien_people_collision(i);
evanso 36:27aa597db3d2 460
evanso 36:27aa597db3d2 461 // deleted spaceship if alien ship touches spaceship
evanso 36:27aa597db3d2 462 if (spaceship.check_alien_collision(alien_vector[i]) &&
evanso 45:fc3238cd28c6 463 !spaceship_destroyed_){
evanso 36:27aa597db3d2 464 create_explosion(spaceship.get_pos());
evanso 45:fc3238cd28c6 465 spaceship_destroyed_ = true;
evanso 36:27aa597db3d2 466 }
evanso 36:27aa597db3d2 467
evanso 36:27aa597db3d2 468 alliens_fire_bullets(i);
evanso 36:27aa597db3d2 469
evanso 36:27aa597db3d2 470 delete_aliens(i);
evanso 34:85ccc16f24d2 471 }
evanso 34:85ccc16f24d2 472 }
evanso 34:85ccc16f24d2 473
evanso 36:27aa597db3d2 474
evanso 36:27aa597db3d2 475
evanso 36:27aa597db3d2 476 //Explotion Control ------------------------------------------------------------
evanso 36:27aa597db3d2 477
evanso 36:27aa597db3d2 478 void GameEngine::create_explosion(Vector2D destroyed_position){
evanso 36:27aa597db3d2 479 // explosion object
evanso 36:27aa597db3d2 480 Explosion new_explosion;
evanso 36:27aa597db3d2 481
evanso 36:27aa597db3d2 482 new_explosion.init(destroyed_position);
evanso 33:7fedd8029473 483
evanso 36:27aa597db3d2 484 // Stores explosion object in vector
evanso 36:27aa597db3d2 485 explosion_vector.push_back(new_explosion);
evanso 36:27aa597db3d2 486 }
evanso 36:27aa597db3d2 487
evanso 36:27aa597db3d2 488 void GameEngine::draw_explosions(){
evanso 36:27aa597db3d2 489 // interates over expoltion vector and draws each explosion object then
evanso 36:27aa597db3d2 490 // deleted object after set size
evanso 36:27aa597db3d2 491 for (int i = 0; i < explosion_vector.size(); i++){
evanso 36:27aa597db3d2 492 explosion_vector[i].draw_explosion(lcd);
evanso 31:6015e8ed859c 493
evanso 36:27aa597db3d2 494 // delete explosion after reaches set size
evanso 36:27aa597db3d2 495 if(explosion_vector[i].get_explosion_radius() == 8){
evanso 36:27aa597db3d2 496 explosion_vector.erase(explosion_vector.begin()+ i);
evanso 31:6015e8ed859c 497 }
evanso 36:27aa597db3d2 498 }
evanso 36:27aa597db3d2 499 }
evanso 36:27aa597db3d2 500
evanso 36:27aa597db3d2 501
evanso 36:27aa597db3d2 502
evanso 36:27aa597db3d2 503 //People Control ---------------------------------------------------------------
evanso 36:27aa597db3d2 504
evanso 36:27aa597db3d2 505 void GameEngine::spawn_people(){
evanso 36:27aa597db3d2 506 // Keeps number of people objects constant as people objecs are erased
evanso 36:27aa597db3d2 507 if(people_vector.size() <= 5){
evanso 36:27aa597db3d2 508 create_people();
evanso 31:6015e8ed859c 509 }
evanso 20:febd920ec29e 510 }
evanso 20:febd920ec29e 511
evanso 33:7fedd8029473 512 void GameEngine::create_people(){
evanso 33:7fedd8029473 513 // People object
evanso 33:7fedd8029473 514 People people;
evanso 33:7fedd8029473 515
evanso 33:7fedd8029473 516 people.init(pad, (rand() % 168 - 84));
evanso 33:7fedd8029473 517
evanso 33:7fedd8029473 518 // Stores alien object in vector
evanso 33:7fedd8029473 519 people_vector.push_back(people);
evanso 33:7fedd8029473 520 }
evanso 33:7fedd8029473 521
evanso 33:7fedd8029473 522 void GameEngine::draw_people(){
evanso 33:7fedd8029473 523 for (int i = 0; i < people_vector.size(); i++){
evanso 34:85ccc16f24d2 524 people_vector[i].draw_people(lcd, d_,
evanso 34:85ccc16f24d2 525 map.get_length_map(), map.get_position_x_map());
evanso 34:85ccc16f24d2 526
evanso 34:85ccc16f24d2 527 //errase person if at top of screen as captured by alien and alien is
evanso 34:85ccc16f24d2 528 //set to track mode
evanso 34:85ccc16f24d2 529 Vector2D people_pos = people_vector[i].get_pos();
evanso 40:71f947254fda 530
evanso 40:71f947254fda 531 for (int x = 0; x < alien_vector.size(); x++){
evanso 40:71f947254fda 532 Vector2D alien_pos = alien_vector[x].get_pos();
evanso 40:71f947254fda 533 if(people_pos.y < 30 && alien_pos.y < 9){
evanso 40:71f947254fda 534
evanso 40:71f947254fda 535 //set alien who abducted person to track mode
evanso 34:85ccc16f24d2 536 if(alien_vector[x].get_collision_people_element() == i){
evanso 34:85ccc16f24d2 537 alien_vector[x].set_track_flag(true);
evanso 40:71f947254fda 538 people_vector.erase(people_vector.begin()+ i);
evanso 34:85ccc16f24d2 539 }
evanso 40:71f947254fda 540
evanso 40:71f947254fda 541 }
evanso 34:85ccc16f24d2 542
evanso 34:85ccc16f24d2 543 }
evanso 33:7fedd8029473 544 }
evanso 33:7fedd8029473 545 }
evanso 33:7fedd8029473 546
evanso 19:1bc0a2d22054 547
evanso 25:70b55f5bfc87 548
evanso 36:27aa597db3d2 549 //Map Control-------------------------------------------------------------------
evanso 19:1bc0a2d22054 550
evanso 36:27aa597db3d2 551 void GameEngine::reset_map_timer(){
evanso 45:fc3238cd28c6 552 if(spaceship_destroyed_){
evanso 45:fc3238cd28c6 553 reset_map_counter_++;
evanso 36:27aa597db3d2 554
evanso 36:27aa597db3d2 555 // stops map movement
evanso 36:27aa597db3d2 556 d_ = CENTRE;
evanso 36:27aa597db3d2 557
evanso 36:27aa597db3d2 558 // reset map after set time
evanso 45:fc3238cd28c6 559 if(reset_map_counter_ == 50){
evanso 36:27aa597db3d2 560 reset_map();
evanso 25:70b55f5bfc87 561 }
evanso 36:27aa597db3d2 562 }
evanso 25:70b55f5bfc87 563 }
evanso 36:27aa597db3d2 564
evanso 30:814674b189f0 565 void GameEngine::reset_map(){
evanso 36:27aa597db3d2 566 // Reassign values to variables
evanso 30:814674b189f0 567 spaceship.init();
evanso 45:fc3238cd28c6 568 spaceship_lives_--;
evanso 45:fc3238cd28c6 569 spaceship_destroyed_ = false;
evanso 45:fc3238cd28c6 570 reset_map_counter_ = 0;
evanso 33:7fedd8029473 571
evanso 34:85ccc16f24d2 572 // erase aliens so redrawn in random positions when respawning spaceship
evanso 34:85ccc16f24d2 573 for (int i = (alien_vector.size() - 1); i >= 0 ; i--){
evanso 34:85ccc16f24d2 574 alien_vector.erase(alien_vector.begin()+ i);
evanso 34:85ccc16f24d2 575 }
evanso 36:27aa597db3d2 576
evanso 34:85ccc16f24d2 577 // erase all people so redrawn at bottom of map
evanso 34:85ccc16f24d2 578 for (int i = (people_vector.size() - 1); i >= 0 ; i--){
evanso 34:85ccc16f24d2 579 people_vector.erase(people_vector.begin()+ i);
evanso 34:85ccc16f24d2 580 }
evanso 36:27aa597db3d2 581
evanso 36:27aa597db3d2 582 // erase all alien bullets
evanso 34:85ccc16f24d2 583 for (int i = (alien_bullet_vector.size() - 1); i >= 0 ; i--){
evanso 34:85ccc16f24d2 584 alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);
evanso 33:7fedd8029473 585 }
evanso 20:febd920ec29e 586 }