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