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 14:26:23 2020 +0000
Revision:
64:e9dfc35a1738
Parent:
63:4631447440cf
Child:
65:daa792a09e1f
Tidy up code in Game Engine class

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