Ben Evans / Mbed 2 deprecated Defender_Game

Dependencies:   mbed

Committer:
evanso
Date:
Thu May 21 20:23:24 2020 +0000
Revision:
67:a2984682d641
Parent:
65:daa792a09e1f
Child:
68:bb1650c657ef
Added SaveGame unit test which all passed! Had to define the unit test that tests actually saving and reading from a file as kept getting an error when declaring the sd object.

Who changed what in which revision?

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