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