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:
Tue May 19 19:58:49 2020 +0000
Revision:
57:d4ce42c24561
Parent:
56:663d0546c235
Child:
58:a9a39424df52
Added draw game over screen function to GameEngine

Who changed what in which revision?

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