Ben Evans / Mbed 2 deprecated Defender_Game

Dependencies:   mbed

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 }