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 14:57:09 2020 +0000
Revision:
47:49fa1adc10b4
Parent:
45:fc3238cd28c6
Child:
49:ed569eceeaa4
Added accelerometer control function to the game.

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