Ben Evans / Mbed 2 deprecated Defender_Game

Dependencies:   mbed

Committer:
evanso
Date:
Thu May 21 00:09:10 2020 +0000
Revision:
63:4631447440cf
Parent:
62:f0c86a854a9e
Child:
64:e9dfc35a1738
Correct error screen show if save isn't present or sd card not inserted

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