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:
Thu May 14 20:04:14 2020 +0000
Revision:
32:c006a9882778
Parent:
31:6015e8ed859c
Child:
33:7fedd8029473
Multiple aliens now spawn in random positions and game has a set spawn rate.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
evanso 8:dd1037c5435b 1 #include "GameEngine.h"
evanso 8:dd1037c5435b 2
evanso 8:dd1037c5435b 3 GameEngine::GameEngine() {
evanso 8:dd1037c5435b 4
evanso 8:dd1037c5435b 5 }
evanso 8:dd1037c5435b 6
evanso 8:dd1037c5435b 7 GameEngine::~GameEngine() {
evanso 8:dd1037c5435b 8
evanso 8:dd1037c5435b 9 }
evanso 8:dd1037c5435b 10
evanso 13:12276eed13ac 11 void GameEngine::init() {
evanso 32:c006a9882778 12 srand(pad.read_adc()*64000);
evanso 8:dd1037c5435b 13 pad.init();
evanso 8:dd1037c5435b 14 lcd.init();
evanso 8:dd1037c5435b 15 spaceship.init();
evanso 13:12276eed13ac 16 map.init(pad);
evanso 32:c006a9882778 17
evanso 32:c006a9882778 18 //spawn 5 aliens at start of game
evanso 32:c006a9882778 19 for(int i = 0; i < 6; i++){
evanso 32:c006a9882778 20 create_alien();
evanso 32:c006a9882778 21 }
evanso 32:c006a9882778 22 spawn_alien_counter = 250;
evanso 32:c006a9882778 23 spawn_alien_counter_two = 0;
evanso 30:814674b189f0 24 spaceship_lives = 3;
evanso 30:814674b189f0 25 spaceship_destroyed = false;
evanso 30:814674b189f0 26 reset_map_counter = 0;
evanso 31:6015e8ed859c 27 smart_bomb_counter = 5;
evanso 8:dd1037c5435b 28 }
evanso 8:dd1037c5435b 29
evanso 13:12276eed13ac 30 void GameEngine::gameplay_loop() {
evanso 30:814674b189f0 31 // clear screen and set contrast
evanso 13:12276eed13ac 32 lcd.setContrast(pad.read_pot1());
evanso 8:dd1037c5435b 33 lcd.clear();
evanso 11:ab578a151f67 34
evanso 15:90b6821bcf64 35 // Gets movements
evanso 15:90b6821bcf64 36 read_joystick_direction();
evanso 13:12276eed13ac 37 spaceship.movement(d_);
evanso 31:6015e8ed859c 38 create_weapons();
evanso 32:c006a9882778 39 spawn_aliens();
evanso 19:1bc0a2d22054 40
evanso 18:11068b98e261 41 // Draws
evanso 30:814674b189f0 42 if (!spaceship_destroyed){
evanso 30:814674b189f0 43 spaceship.draw(lcd);
evanso 30:814674b189f0 44 }
evanso 18:11068b98e261 45 map.draw_map(lcd, d_);
evanso 20:febd920ec29e 46 draw_aliens();
evanso 19:1bc0a2d22054 47 draw_bullets();
evanso 25:70b55f5bfc87 48 draw_explosions();
evanso 30:814674b189f0 49
evanso 30:814674b189f0 50 // Resets map after set frames so spaceship explosion animation showes
evanso 30:814674b189f0 51 if(spaceship_destroyed){
evanso 30:814674b189f0 52 reset_map_counter++;
evanso 30:814674b189f0 53 if(reset_map_counter == 50){
evanso 30:814674b189f0 54 reset_map();
evanso 30:814674b189f0 55 }
evanso 30:814674b189f0 56 }
evanso 30:814674b189f0 57
evanso 18:11068b98e261 58 // refresh's screen
evanso 18:11068b98e261 59 lcd.refresh();
evanso 13:12276eed13ac 60 }
evanso 13:12276eed13ac 61
evanso 15:90b6821bcf64 62 void GameEngine::read_joystick_direction(){
evanso 13:12276eed13ac 63 d_ = pad.get_direction();
evanso 18:11068b98e261 64 }
evanso 18:11068b98e261 65
evanso 32:c006a9882778 66 void GameEngine::spawn_aliens(){
evanso 32:c006a9882778 67 int x = floor(spawn_alien_counter);
evanso 32:c006a9882778 68 if(spawn_alien_counter_two%x == 0){
evanso 32:c006a9882778 69 create_alien();
evanso 32:c006a9882778 70 }
evanso 32:c006a9882778 71
evanso 32:c006a9882778 72 if(spawn_alien_counter > 125){
evanso 32:c006a9882778 73 spawn_alien_counter --;
evanso 32:c006a9882778 74 }
evanso 32:c006a9882778 75 spawn_alien_counter_two++;
evanso 32:c006a9882778 76 }
evanso 32:c006a9882778 77
evanso 31:6015e8ed859c 78 void GameEngine::create_weapons(){
evanso 31:6015e8ed859c 79 //Spaceship bullets
evanso 19:1bc0a2d22054 80 if (pad.A_pressed()){
evanso 19:1bc0a2d22054 81 // Bullet object
evanso 19:1bc0a2d22054 82 Weapons new_bullet;
evanso 19:1bc0a2d22054 83
evanso 27:8bb2bd97c319 84 new_bullet.init(spaceship.get_pos(),
evanso 28:a5958497d5ce 85 spaceship.get_spaceship_sprite_direction(), true);
evanso 19:1bc0a2d22054 86
evanso 20:febd920ec29e 87 // Stores bullet object in vector
evanso 19:1bc0a2d22054 88 bullet_vector.push_back(new_bullet);
evanso 20:febd920ec29e 89 }
evanso 31:6015e8ed859c 90 // Smart bomb
evanso 31:6015e8ed859c 91 if (pad.B_pressed() && smart_bomb_counter > 0){
evanso 31:6015e8ed859c 92 Weapons weapons;
evanso 31:6015e8ed859c 93
evanso 31:6015e8ed859c 94 weapons.smart_bomb(lcd);
evanso 31:6015e8ed859c 95 smart_bomb_counter--;
evanso 31:6015e8ed859c 96
evanso 31:6015e8ed859c 97 //Deletes alien object if on screen
evanso 31:6015e8ed859c 98 for (int i = 0; i < alien_vector.size(); i++){
evanso 31:6015e8ed859c 99 Vector2D alien_pos = alien_vector[i].get_pos();
evanso 31:6015e8ed859c 100
evanso 31:6015e8ed859c 101 if(alien_pos.x <= 84 && alien_pos.x >= -6){
evanso 31:6015e8ed859c 102 create_explosion(alien_pos);
evanso 31:6015e8ed859c 103 alien_vector.erase(alien_vector.begin()+ i);
evanso 31:6015e8ed859c 104 }
evanso 31:6015e8ed859c 105 }
evanso 31:6015e8ed859c 106
evanso 31:6015e8ed859c 107 }
evanso 20:febd920ec29e 108 }
evanso 20:febd920ec29e 109
evanso 20:febd920ec29e 110 void GameEngine::create_alien(){
evanso 32:c006a9882778 111 int position_x_start = 0;
evanso 32:c006a9882778 112
evanso 20:febd920ec29e 113 // Alien object
evanso 20:febd920ec29e 114 Alien new_alien;
evanso 32:c006a9882778 115
evanso 32:c006a9882778 116 //Creats randon number for x pos for x > 84 and x <0
evanso 32:c006a9882778 117 if(rand() % 2){
evanso 32:c006a9882778 118 position_x_start = rand() % 84 + 84;
evanso 32:c006a9882778 119 }else{
evanso 32:c006a9882778 120 position_x_start =rand() % 83 - 84;
evanso 32:c006a9882778 121 }
evanso 32:c006a9882778 122
evanso 32:c006a9882778 123 new_alien.init(pad, position_x_start, (rand() % 45));
evanso 20:febd920ec29e 124
evanso 20:febd920ec29e 125 // Stores alien object in vector
evanso 20:febd920ec29e 126 alien_vector.push_back(new_alien);
evanso 19:1bc0a2d22054 127 }
evanso 19:1bc0a2d22054 128
evanso 29:e96d91f1d39c 129 void GameEngine::create_explosion(Vector2D destroyed_position){
evanso 25:70b55f5bfc87 130 // explosion object
evanso 25:70b55f5bfc87 131 Explosion new_explosion;
evanso 25:70b55f5bfc87 132
evanso 29:e96d91f1d39c 133 new_explosion.init(destroyed_position);
evanso 25:70b55f5bfc87 134
evanso 25:70b55f5bfc87 135 // Stores explosion object in vector
evanso 25:70b55f5bfc87 136 explosion_vector.push_back(new_explosion);
evanso 25:70b55f5bfc87 137 }
evanso 25:70b55f5bfc87 138
evanso 19:1bc0a2d22054 139 void GameEngine::draw_bullets(){
evanso 29:e96d91f1d39c 140 // interates over bullet vectors, moves and draws bullet object
evanso 29:e96d91f1d39c 141
evanso 29:e96d91f1d39c 142 // Alien bullets
evanso 28:a5958497d5ce 143 for (int i = 0; i < alien_bullet_vector.size(); i++){
evanso 28:a5958497d5ce 144 alien_bullet_vector[i].draw_alien_bullet(lcd, d_);
evanso 28:a5958497d5ce 145
evanso 29:e96d91f1d39c 146 // deletes alien bullet object after bullet has moved set distance
evanso 28:a5958497d5ce 147 if(alien_bullet_vector[i].get_bullet_delete_counter() >> 7){
evanso 28:a5958497d5ce 148 alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);
evanso 28:a5958497d5ce 149 }
evanso 29:e96d91f1d39c 150
evanso 30:814674b189f0 151 // Deletes bullet and shpaceship if collision detected
evanso 30:814674b189f0 152 if (spaceship.check_collision(alien_bullet_vector[i]) &&
evanso 30:814674b189f0 153 !spaceship_destroyed ){
evanso 29:e96d91f1d39c 154 create_explosion(spaceship.get_pos());
evanso 30:814674b189f0 155
evanso 30:814674b189f0 156 spaceship_destroyed = true;
evanso 30:814674b189f0 157 alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);
evanso 29:e96d91f1d39c 158 }
evanso 28:a5958497d5ce 159 }
evanso 29:e96d91f1d39c 160
evanso 29:e96d91f1d39c 161 // Spaceship bullets
evanso 19:1bc0a2d22054 162 for (int i = 0; i < bullet_vector.size(); i++){
evanso 19:1bc0a2d22054 163 bullet_vector[i].draw_bullet(lcd);
evanso 28:a5958497d5ce 164
evanso 28:a5958497d5ce 165 // deletes bullet object after bullet has moved set distance
evanso 28:a5958497d5ce 166 if(bullet_vector[i].get_bullet_delete_counter() >> 5){
evanso 20:febd920ec29e 167 bullet_vector.erase(bullet_vector.begin()+ i);
evanso 20:febd920ec29e 168 }
evanso 19:1bc0a2d22054 169 }
evanso 19:1bc0a2d22054 170 }
evanso 19:1bc0a2d22054 171
evanso 20:febd920ec29e 172 void GameEngine::draw_aliens(){
evanso 29:e96d91f1d39c 173 // interates over alien vector and draws each new_alien object
evanso 20:febd920ec29e 174 for (int i = 0; i < alien_vector.size(); i++){
evanso 27:8bb2bd97c319 175 alien_vector[i].draw_alien(lcd,spaceship.get_pos(),d_,
evanso 27:8bb2bd97c319 176 map.get_length_map(), map.get_position_x_map());
evanso 20:febd920ec29e 177
evanso 30:814674b189f0 178 // deleted spaceship if alien ship touches spaceship
evanso 30:814674b189f0 179 if (spaceship.check_alien_collision(alien_vector[i]) &&
evanso 30:814674b189f0 180 !spaceship_destroyed){
evanso 30:814674b189f0 181 create_explosion(spaceship.get_pos());
evanso 30:814674b189f0 182 spaceship_destroyed = true;
evanso 30:814674b189f0 183 }
evanso 30:814674b189f0 184
evanso 29:e96d91f1d39c 185 // alien sprites fire bullet randomley
evanso 28:a5958497d5ce 186 if (alien_vector[i].get_alien_fire_counter()%60 == 0){
evanso 28:a5958497d5ce 187 Weapons alien_bullet;
evanso 28:a5958497d5ce 188
evanso 28:a5958497d5ce 189 // fires bullet towards direction of spaceship
evanso 28:a5958497d5ce 190 bool alien_bullet_direction = false;
evanso 28:a5958497d5ce 191 Vector2D spaceship_pos = spaceship.get_pos();
evanso 28:a5958497d5ce 192 Vector2D alien_pos = alien_vector[i].get_pos();
evanso 28:a5958497d5ce 193 if(spaceship_pos.x > alien_pos.x){
evanso 28:a5958497d5ce 194 alien_bullet_direction = true;
evanso 28:a5958497d5ce 195 }
evanso 28:a5958497d5ce 196
evanso 28:a5958497d5ce 197 alien_bullet.init(alien_vector[i].get_pos(),
evanso 28:a5958497d5ce 198 alien_bullet_direction , false);
evanso 28:a5958497d5ce 199
evanso 28:a5958497d5ce 200 // Stores bullet object in vector
evanso 28:a5958497d5ce 201 alien_bullet_vector.push_back(alien_bullet);
evanso 28:a5958497d5ce 202 }
evanso 28:a5958497d5ce 203
evanso 29:e96d91f1d39c 204 // Deletes bullet and alien if collision detected and draws explosion
evanso 29:e96d91f1d39c 205 for (int x = 0; x < bullet_vector.size(); x++){
evanso 29:e96d91f1d39c 206 if (alien_vector[i].check_collision(bullet_vector[x])){
evanso 29:e96d91f1d39c 207 create_explosion(alien_vector[i].get_pos());
evanso 25:70b55f5bfc87 208
evanso 29:e96d91f1d39c 209 bullet_vector.erase(bullet_vector.begin()+ i);
evanso 29:e96d91f1d39c 210 alien_vector.erase(alien_vector.begin()+ i);
evanso 29:e96d91f1d39c 211 }
evanso 25:70b55f5bfc87 212 }
evanso 25:70b55f5bfc87 213 }
evanso 25:70b55f5bfc87 214 }
evanso 25:70b55f5bfc87 215
evanso 25:70b55f5bfc87 216 void GameEngine::draw_explosions(){
evanso 27:8bb2bd97c319 217 // interates over expoltion vector and draws each explosion object then
evanso 27:8bb2bd97c319 218 // deleted object after set size
evanso 25:70b55f5bfc87 219 for (int i = 0; i < explosion_vector.size(); i++){
evanso 25:70b55f5bfc87 220 explosion_vector[i].draw_explosion(lcd);
evanso 25:70b55f5bfc87 221
evanso 25:70b55f5bfc87 222 // delete explosion after reaches set size
evanso 25:70b55f5bfc87 223 if(explosion_vector[i].get_explosion_radius() == 8){
evanso 25:70b55f5bfc87 224 explosion_vector.erase(explosion_vector.begin()+ i);
evanso 20:febd920ec29e 225 }
evanso 20:febd920ec29e 226 }
evanso 30:814674b189f0 227 }
evanso 30:814674b189f0 228
evanso 30:814674b189f0 229 void GameEngine::reset_map(){
evanso 30:814674b189f0 230 spaceship.init();
evanso 30:814674b189f0 231 spaceship_lives--;
evanso 30:814674b189f0 232 spaceship_destroyed = false;
evanso 30:814674b189f0 233 reset_map_counter = 0;
evanso 20:febd920ec29e 234 }