Ben Evans University Second Year Project. Game Called Defender.

Dependencies:   mbed

https://os.mbed.com/media/uploads/evanso/84bc1a30759fd6a1e3f1fd1fae3e97c2.png

Hello, soldier, you have been specially selected as the defender of planet earth.

Your mission, if you choose to accept it. Fly around the planet and pulverise invading alien ships for as long as you can. Stop the aliens abducting the innocent people on the ground. Be warned if an alien ship manages to abduct a person and take them to top of the screen, they will no longer move randomly and will begin to hunt you down. This sounds like a challenge you were trained for.

But don’t worry soldier you’re not going into battle empty-handed. Your ship is equipped with a state of the art laser beam that has unlimited ammo and four smart bombs that will destroy anything on the screen. The ship also has three lives so use them wisely.

As time goes on more alien ships will arrive on planet earth increasing the difficulty of your mission. And remember the landscape bellow loops around so if you continually fly in the same direction you go to your original position. Good luck soldier.

Committer:
evanso
Date:
Thu May 21 22:46:23 2020 +0000
Revision:
68:bb1650c657ef
Parent:
67:a2984682d641
Child:
69:753ba27325ce
Added sprites file to store letter for the title screen and arrows for menus. Also added a time to stop double-button presses.

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