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 17:37:37 2020 +0000
Revision:
30:814674b189f0
Parent:
29:e96d91f1d39c
Child:
31:6015e8ed859c
Added if alien and ship collide the ship is destroyed.

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 8:dd1037c5435b 12 pad.init();
evanso 8:dd1037c5435b 13 lcd.init();
evanso 8:dd1037c5435b 14 spaceship.init();
evanso 13:12276eed13ac 15 map.init(pad);
evanso 20:febd920ec29e 16 create_alien();
evanso 30:814674b189f0 17 spaceship_lives = 3;
evanso 30:814674b189f0 18 spaceship_destroyed = false;
evanso 30:814674b189f0 19 reset_map_counter = 0;
evanso 8:dd1037c5435b 20 }
evanso 8:dd1037c5435b 21
evanso 13:12276eed13ac 22 void GameEngine::gameplay_loop() {
evanso 30:814674b189f0 23 // clear screen and set contrast
evanso 13:12276eed13ac 24 lcd.setContrast(pad.read_pot1());
evanso 8:dd1037c5435b 25 lcd.clear();
evanso 11:ab578a151f67 26
evanso 15:90b6821bcf64 27 // Gets movements
evanso 15:90b6821bcf64 28 read_joystick_direction();
evanso 13:12276eed13ac 29 spaceship.movement(d_);
evanso 19:1bc0a2d22054 30 create_bullet();
evanso 19:1bc0a2d22054 31
evanso 18:11068b98e261 32 // Draws
evanso 30:814674b189f0 33 if (!spaceship_destroyed){
evanso 30:814674b189f0 34 spaceship.draw(lcd);
evanso 30:814674b189f0 35 }
evanso 18:11068b98e261 36 map.draw_map(lcd, d_);
evanso 20:febd920ec29e 37 draw_aliens();
evanso 19:1bc0a2d22054 38 draw_bullets();
evanso 25:70b55f5bfc87 39 draw_explosions();
evanso 30:814674b189f0 40
evanso 30:814674b189f0 41 // Resets map after set frames so spaceship explosion animation showes
evanso 30:814674b189f0 42 if(spaceship_destroyed){
evanso 30:814674b189f0 43 reset_map_counter++;
evanso 30:814674b189f0 44 if(reset_map_counter == 50){
evanso 30:814674b189f0 45 reset_map();
evanso 30:814674b189f0 46 }
evanso 30:814674b189f0 47 }
evanso 30:814674b189f0 48
evanso 18:11068b98e261 49 // refresh's screen
evanso 18:11068b98e261 50 lcd.refresh();
evanso 13:12276eed13ac 51 }
evanso 13:12276eed13ac 52
evanso 15:90b6821bcf64 53 void GameEngine::read_joystick_direction(){
evanso 13:12276eed13ac 54 d_ = pad.get_direction();
evanso 18:11068b98e261 55 }
evanso 18:11068b98e261 56
evanso 19:1bc0a2d22054 57 void GameEngine::create_bullet(){
evanso 19:1bc0a2d22054 58 if (pad.A_pressed()){
evanso 19:1bc0a2d22054 59 // Bullet object
evanso 19:1bc0a2d22054 60 Weapons new_bullet;
evanso 19:1bc0a2d22054 61
evanso 27:8bb2bd97c319 62 new_bullet.init(spaceship.get_pos(),
evanso 28:a5958497d5ce 63 spaceship.get_spaceship_sprite_direction(), true);
evanso 19:1bc0a2d22054 64
evanso 20:febd920ec29e 65 // Stores bullet object in vector
evanso 19:1bc0a2d22054 66 bullet_vector.push_back(new_bullet);
evanso 20:febd920ec29e 67 }
evanso 20:febd920ec29e 68 }
evanso 20:febd920ec29e 69
evanso 20:febd920ec29e 70 void GameEngine::create_alien(){
evanso 20:febd920ec29e 71 // Alien object
evanso 20:febd920ec29e 72 Alien new_alien;
evanso 21:f7d7834e3af1 73
evanso 24:479da6ca0e7e 74 new_alien.init(pad);
evanso 20:febd920ec29e 75
evanso 20:febd920ec29e 76 // Stores alien object in vector
evanso 20:febd920ec29e 77 alien_vector.push_back(new_alien);
evanso 19:1bc0a2d22054 78 }
evanso 19:1bc0a2d22054 79
evanso 29:e96d91f1d39c 80 void GameEngine::create_explosion(Vector2D destroyed_position){
evanso 25:70b55f5bfc87 81 // explosion object
evanso 25:70b55f5bfc87 82 Explosion new_explosion;
evanso 25:70b55f5bfc87 83
evanso 29:e96d91f1d39c 84 new_explosion.init(destroyed_position);
evanso 25:70b55f5bfc87 85
evanso 25:70b55f5bfc87 86 // Stores explosion object in vector
evanso 25:70b55f5bfc87 87 explosion_vector.push_back(new_explosion);
evanso 25:70b55f5bfc87 88 }
evanso 25:70b55f5bfc87 89
evanso 19:1bc0a2d22054 90 void GameEngine::draw_bullets(){
evanso 29:e96d91f1d39c 91 // interates over bullet vectors, moves and draws bullet object
evanso 29:e96d91f1d39c 92
evanso 29:e96d91f1d39c 93 // Alien bullets
evanso 28:a5958497d5ce 94 for (int i = 0; i < alien_bullet_vector.size(); i++){
evanso 28:a5958497d5ce 95 alien_bullet_vector[i].draw_alien_bullet(lcd, d_);
evanso 28:a5958497d5ce 96
evanso 29:e96d91f1d39c 97 // deletes alien bullet object after bullet has moved set distance
evanso 28:a5958497d5ce 98 if(alien_bullet_vector[i].get_bullet_delete_counter() >> 7){
evanso 28:a5958497d5ce 99 alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);
evanso 28:a5958497d5ce 100 }
evanso 29:e96d91f1d39c 101
evanso 30:814674b189f0 102 // Deletes bullet and shpaceship if collision detected
evanso 30:814674b189f0 103 if (spaceship.check_collision(alien_bullet_vector[i]) &&
evanso 30:814674b189f0 104 !spaceship_destroyed ){
evanso 29:e96d91f1d39c 105 create_explosion(spaceship.get_pos());
evanso 30:814674b189f0 106
evanso 30:814674b189f0 107 spaceship_destroyed = true;
evanso 30:814674b189f0 108 alien_bullet_vector.erase(alien_bullet_vector.begin()+ i);
evanso 29:e96d91f1d39c 109 }
evanso 28:a5958497d5ce 110 }
evanso 29:e96d91f1d39c 111
evanso 29:e96d91f1d39c 112 // Spaceship bullets
evanso 19:1bc0a2d22054 113 for (int i = 0; i < bullet_vector.size(); i++){
evanso 19:1bc0a2d22054 114 bullet_vector[i].draw_bullet(lcd);
evanso 28:a5958497d5ce 115
evanso 28:a5958497d5ce 116 // deletes bullet object after bullet has moved set distance
evanso 28:a5958497d5ce 117 if(bullet_vector[i].get_bullet_delete_counter() >> 5){
evanso 20:febd920ec29e 118 bullet_vector.erase(bullet_vector.begin()+ i);
evanso 20:febd920ec29e 119 }
evanso 19:1bc0a2d22054 120 }
evanso 19:1bc0a2d22054 121 }
evanso 19:1bc0a2d22054 122
evanso 20:febd920ec29e 123 void GameEngine::draw_aliens(){
evanso 29:e96d91f1d39c 124 // interates over alien vector and draws each new_alien object
evanso 20:febd920ec29e 125 for (int i = 0; i < alien_vector.size(); i++){
evanso 27:8bb2bd97c319 126 alien_vector[i].draw_alien(lcd,spaceship.get_pos(),d_,
evanso 27:8bb2bd97c319 127 map.get_length_map(), map.get_position_x_map());
evanso 20:febd920ec29e 128
evanso 30:814674b189f0 129 // deleted spaceship if alien ship touches spaceship
evanso 30:814674b189f0 130 if (spaceship.check_alien_collision(alien_vector[i]) &&
evanso 30:814674b189f0 131 !spaceship_destroyed){
evanso 30:814674b189f0 132 create_explosion(spaceship.get_pos());
evanso 30:814674b189f0 133 spaceship_destroyed = true;
evanso 30:814674b189f0 134 }
evanso 30:814674b189f0 135
evanso 29:e96d91f1d39c 136 // alien sprites fire bullet randomley
evanso 28:a5958497d5ce 137 if (alien_vector[i].get_alien_fire_counter()%60 == 0){
evanso 28:a5958497d5ce 138 Weapons alien_bullet;
evanso 28:a5958497d5ce 139
evanso 28:a5958497d5ce 140 // fires bullet towards direction of spaceship
evanso 28:a5958497d5ce 141 bool alien_bullet_direction = false;
evanso 28:a5958497d5ce 142 Vector2D spaceship_pos = spaceship.get_pos();
evanso 28:a5958497d5ce 143 Vector2D alien_pos = alien_vector[i].get_pos();
evanso 28:a5958497d5ce 144 if(spaceship_pos.x > alien_pos.x){
evanso 28:a5958497d5ce 145 alien_bullet_direction = true;
evanso 28:a5958497d5ce 146 }
evanso 28:a5958497d5ce 147
evanso 28:a5958497d5ce 148 alien_bullet.init(alien_vector[i].get_pos(),
evanso 28:a5958497d5ce 149 alien_bullet_direction , false);
evanso 28:a5958497d5ce 150
evanso 28:a5958497d5ce 151 // Stores bullet object in vector
evanso 28:a5958497d5ce 152 alien_bullet_vector.push_back(alien_bullet);
evanso 28:a5958497d5ce 153 }
evanso 28:a5958497d5ce 154
evanso 29:e96d91f1d39c 155 // Deletes bullet and alien if collision detected and draws explosion
evanso 29:e96d91f1d39c 156 for (int x = 0; x < bullet_vector.size(); x++){
evanso 29:e96d91f1d39c 157 if (alien_vector[i].check_collision(bullet_vector[x])){
evanso 29:e96d91f1d39c 158 create_explosion(alien_vector[i].get_pos());
evanso 25:70b55f5bfc87 159
evanso 29:e96d91f1d39c 160 bullet_vector.erase(bullet_vector.begin()+ i);
evanso 29:e96d91f1d39c 161 alien_vector.erase(alien_vector.begin()+ i);
evanso 29:e96d91f1d39c 162 }
evanso 25:70b55f5bfc87 163 }
evanso 25:70b55f5bfc87 164 }
evanso 25:70b55f5bfc87 165 }
evanso 25:70b55f5bfc87 166
evanso 25:70b55f5bfc87 167 void GameEngine::draw_explosions(){
evanso 27:8bb2bd97c319 168 // interates over expoltion vector and draws each explosion object then
evanso 27:8bb2bd97c319 169 // deleted object after set size
evanso 25:70b55f5bfc87 170 for (int i = 0; i < explosion_vector.size(); i++){
evanso 25:70b55f5bfc87 171 explosion_vector[i].draw_explosion(lcd);
evanso 25:70b55f5bfc87 172
evanso 25:70b55f5bfc87 173 // delete explosion after reaches set size
evanso 25:70b55f5bfc87 174 if(explosion_vector[i].get_explosion_radius() == 8){
evanso 25:70b55f5bfc87 175 explosion_vector.erase(explosion_vector.begin()+ i);
evanso 20:febd920ec29e 176 }
evanso 20:febd920ec29e 177 }
evanso 30:814674b189f0 178 }
evanso 30:814674b189f0 179
evanso 30:814674b189f0 180 void GameEngine::reset_map(){
evanso 30:814674b189f0 181 spaceship.init();
evanso 30:814674b189f0 182 spaceship_lives--;
evanso 30:814674b189f0 183 spaceship_destroyed = false;
evanso 30:814674b189f0 184 reset_map_counter = 0;
evanso 20:febd920ec29e 185 }