Initial publish

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

Committer:
Noximilien
Date:
Fri Apr 26 13:09:03 2019 +0000
Revision:
32:5403bb974294
Parent:
31:becb8f6bf7b7
Child:
33:c623c6d5ed16
Have added small features. Have cleaned the code a bit.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Noximilien 21:0eb394495b8a 1 #ifndef ENEMIES_H
Noximilien 21:0eb394495b8a 2 #define ENEMIES_H
Noximilien 21:0eb394495b8a 3
Noximilien 21:0eb394495b8a 4 #include "constants.h"
Noximilien 21:0eb394495b8a 5 #include "geometry.h"
Noximilien 25:749f1efc31fc 6 #include "game.h"
Noximilien 21:0eb394495b8a 7
Noximilien 29:579e00b7f118 8 /** A bool that changes states between whehter to go up or down in y-direction.*/
Noximilien 28:35af3843de8f 9 bool switch_enemy_y_dir = false;
Noximilien 29:579e00b7f118 10 /** Enemy speed movement - increasing the value will increase the speed.*/
Noximilien 26:676874c42883 11 extern int enemy_speed = 1;
Noximilien 29:579e00b7f118 12 /** Enemy blast speed - increasing the value will increase the speed.*/
Noximilien 30:d454d0cb72bc 13 extern int enemy_blast_speed = 2;
Noximilien 29:579e00b7f118 14 /** Maximum enemies allowed on the screen */
Noximilien 26:676874c42883 15 const int max_enemies = 4;
Noximilien 29:579e00b7f118 16 /** Maximum enemies' blasts allowed on the screen*/
Noximilien 26:676874c42883 17 const int max_enemy_blasts = max_enemies*2;
Noximilien 21:0eb394495b8a 18
Noximilien 31:becb8f6bf7b7 19 /**
Noximilien 31:becb8f6bf7b7 20 * Enemy Class
Noximilien 31:becb8f6bf7b7 21 * @brief A class to describe the states of an enemy ship.
Noximilien 29:579e00b7f118 22 * @author Dmitrijs Griskovs
Noximilien 29:579e00b7f118 23 * @date 15/04/2019
Noximilien 24:0570cb4b92d7 24 */
Noximilien 21:0eb394495b8a 25 class Enemy : public GameObject {
Noximilien 21:0eb394495b8a 26 public:
Noximilien 31:becb8f6bf7b7 27 /**
Noximilien 31:becb8f6bf7b7 28 * @brief Enemy spawn function.
Noximilien 31:becb8f6bf7b7 29 * @details This function spawns an enemy on the right side of the screen
Noximilien 31:becb8f6bf7b7 30 * and at random position in the y-direction.
Noximilien 31:becb8f6bf7b7 31 */
Noximilien 21:0eb394495b8a 32 void spawn() {
Noximilien 23:240bc00ef25b 33 // giving the enemy the spawning positions
Noximilien 21:0eb394495b8a 34 Point spawn_pos(screen_width, game_area_y + rand() % (game_area_height - enemy2_height));
Noximilien 21:0eb394495b8a 35 GameObject::spawn(spawn_pos);
Noximilien 21:0eb394495b8a 36 dead = false;
Noximilien 21:0eb394495b8a 37 dead_counter = 0;
Noximilien 21:0eb394495b8a 38 blast_countdown = 0;
Noximilien 21:0eb394495b8a 39 }
Noximilien 31:becb8f6bf7b7 40 /**
Noximilien 31:becb8f6bf7b7 41 * @brief enemy death sound and status reset.
Noximilien 31:becb8f6bf7b7 42 * @details Marks enemy as dead, so it can display explosion anation.
Noximilien 31:becb8f6bf7b7 43 */
Noximilien 21:0eb394495b8a 44 void die() {
Noximilien 27:f05f4e738ba9 45 gamepad.tone(123,0.3);
Noximilien 21:0eb394495b8a 46 dead = true;
Noximilien 21:0eb394495b8a 47 dead_counter = 3;
Noximilien 21:0eb394495b8a 48 }
Noximilien 31:becb8f6bf7b7 49
Noximilien 31:becb8f6bf7b7 50 /**
Noximilien 31:becb8f6bf7b7 51 * @brief Draws and updates enemy sprites on the screen and substracts the score
Noximilien 31:becb8f6bf7b7 52 * if the ship leaves the screen limits.
Noximilien 31:becb8f6bf7b7 53 *
Noximilien 31:becb8f6bf7b7 54 * @details The function draws this enemy ship on the screen, and
Noximilien 31:becb8f6bf7b7 55 * changes their x and y positions each time the function is called.
Noximilien 31:becb8f6bf7b7 56 * If ship is dead then it draws enemy explosion animation and then disables it.
Noximilien 31:becb8f6bf7b7 57 * Disables the ship when it leaves the screen limits and substracts
Noximilien 31:becb8f6bf7b7 58 * the in game score by -50.
Noximilien 31:becb8f6bf7b7 59 */
Noximilien 21:0eb394495b8a 60 void updateAndDraw() {
Noximilien 21:0eb394495b8a 61 pos.x -= enemy_speed;
Noximilien 31:becb8f6bf7b7 62 if (GameGlobals::game_score >= 200){
Noximilien 28:35af3843de8f 63 if (switch_enemy_y_dir == false){pos.y -= 1;}
Noximilien 28:35af3843de8f 64 else if(switch_enemy_y_dir == true){pos.y += 1;}
Noximilien 32:5403bb974294 65 if (pos.y >= (game_area_height - enemy2_height)){
Noximilien 28:35af3843de8f 66 switch_enemy_y_dir = false;
Noximilien 28:35af3843de8f 67 }
Noximilien 32:5403bb974294 68 else if (pos.y <= game_area_y){
Noximilien 28:35af3843de8f 69 switch_enemy_y_dir = true;
Noximilien 28:35af3843de8f 70 }
Noximilien 28:35af3843de8f 71 }
Noximilien 29:579e00b7f118 72 if (!dead) { drawSprite(pos, enemy2_sprite);}
Noximilien 29:579e00b7f118 73 else { updateAndDrawDeathExplosion();}
Noximilien 29:579e00b7f118 74
Noximilien 21:0eb394495b8a 75 if (pos.x < 0) {
Noximilien 31:becb8f6bf7b7 76 GameGlobals::game_score -= 50;
Noximilien 31:becb8f6bf7b7 77 GameGlobals::score_count_for_difficulty -= 50;
Noximilien 21:0eb394495b8a 78 active = false;
Noximilien 21:0eb394495b8a 79 }
Noximilien 21:0eb394495b8a 80 }
Noximilien 31:becb8f6bf7b7 81 /**
Noximilien 31:becb8f6bf7b7 82 * @brief Draws enemy explosion sprite
Noximilien 31:becb8f6bf7b7 83 * @details Draws the enemy ships explosion sprites when the player's
Noximilien 31:becb8f6bf7b7 84 * shot hits them or when the player collides with them.
Noximilien 31:becb8f6bf7b7 85 * the animation consists of two sprites "Exploded" and "Half exploded".
Noximilien 31:becb8f6bf7b7 86 */
Noximilien 21:0eb394495b8a 87 void updateAndDrawDeathExplosion() {
Noximilien 21:0eb394495b8a 88 if (dead_counter > 0) {
Noximilien 21:0eb394495b8a 89 dead_counter--;
Noximilien 21:0eb394495b8a 90 if (dead_counter == 2){
Noximilien 29:579e00b7f118 91 drawSprite(pos, enemy2_half_exploded_sprite);
Noximilien 21:0eb394495b8a 92 } else if (dead_counter == 1){
Noximilien 29:579e00b7f118 93 drawSprite(pos, enemy2_exploded_sprite);
Noximilien 21:0eb394495b8a 94 }
Noximilien 21:0eb394495b8a 95 } else {
Noximilien 21:0eb394495b8a 96 active = false;
Noximilien 21:0eb394495b8a 97 }
Noximilien 21:0eb394495b8a 98 }
Noximilien 21:0eb394495b8a 99
Noximilien 21:0eb394495b8a 100 bool dead;
Noximilien 21:0eb394495b8a 101 int dead_counter;
Noximilien 21:0eb394495b8a 102 int blast_countdown;
Noximilien 21:0eb394495b8a 103 };
Noximilien 21:0eb394495b8a 104
Noximilien 23:240bc00ef25b 105
Noximilien 31:becb8f6bf7b7 106 /**
Noximilien 31:becb8f6bf7b7 107 * Enemies Class
Noximilien 31:becb8f6bf7b7 108 * @brief The class manages all enemy ships.
Noximilien 31:becb8f6bf7b7 109 * @details Responsible for spawning new ships and holding and updating them
Noximilien 31:becb8f6bf7b7 110 * and controlling time intervals between enemy shots.
Noximilien 31:becb8f6bf7b7 111 * @author Dmitrijs Griskovs
Noximilien 31:becb8f6bf7b7 112 * @date 15/04/2019
Noximilien 31:becb8f6bf7b7 113 */
Noximilien 21:0eb394495b8a 114 class Enemies {
Noximilien 21:0eb394495b8a 115 public:
Noximilien 23:240bc00ef25b 116 Enemy enemy_blasts[max_enemy_blasts];
Noximilien 23:240bc00ef25b 117 Enemy enemies[max_enemies];
Noximilien 23:240bc00ef25b 118 CircleBounds enemy_bounds;
Noximilien 23:240bc00ef25b 119 CircleBounds enemy_blast_bounds;
Noximilien 23:240bc00ef25b 120
Noximilien 31:becb8f6bf7b7 121 /**
Noximilien 31:becb8f6bf7b7 122 * A constructor for the enemy's sprite body circle area and the blast circle
Noximilien 31:becb8f6bf7b7 123 * area. It sets the circle radius for collsion callculations.
Noximilien 31:becb8f6bf7b7 124 */
Noximilien 21:0eb394495b8a 125 Enemies () {
Noximilien 21:0eb394495b8a 126 enemy_bounds.center.x = 5;
Noximilien 21:0eb394495b8a 127 enemy_bounds.center.y = 3;
Noximilien 26:676874c42883 128 enemy_bounds.radius = 6;
Noximilien 21:0eb394495b8a 129
Noximilien 21:0eb394495b8a 130 enemy_blast_bounds.center.x = 0;
Noximilien 21:0eb394495b8a 131 enemy_blast_bounds.center.y = 1;
Noximilien 21:0eb394495b8a 132 enemy_blast_bounds.radius = 1;
Noximilien 21:0eb394495b8a 133 }
Noximilien 31:becb8f6bf7b7 134
Noximilien 31:becb8f6bf7b7 135 /**
Noximilien 31:becb8f6bf7b7 136 * @brief This function spawns a new enemy on the screen.
Noximilien 31:becb8f6bf7b7 137 * @details It spawns a new enemy on the screen when there is a free space
Noximilien 31:becb8f6bf7b7 138 * in the enemy aray.
Noximilien 31:becb8f6bf7b7 139 */
Noximilien 21:0eb394495b8a 140 void spawnNewEnemy() {
Noximilien 21:0eb394495b8a 141 int found = -1;
Noximilien 21:0eb394495b8a 142 for (int i = 0; i < max_enemies; ++i) {
Noximilien 21:0eb394495b8a 143 if (!enemies[i].active) {
Noximilien 21:0eb394495b8a 144 found = i;
Noximilien 21:0eb394495b8a 145 break;
Noximilien 21:0eb394495b8a 146 }
Noximilien 21:0eb394495b8a 147 }
Noximilien 21:0eb394495b8a 148
Noximilien 21:0eb394495b8a 149 if (found != -1) {
Noximilien 21:0eb394495b8a 150 enemies[found].spawn();
Noximilien 21:0eb394495b8a 151 }
Noximilien 21:0eb394495b8a 152 }
Noximilien 31:becb8f6bf7b7 153
Noximilien 31:becb8f6bf7b7 154 /**
Noximilien 31:becb8f6bf7b7 155 * @brief Draws the ships and the blasts.
Noximilien 31:becb8f6bf7b7 156 * @details Updates and draws all active enemy ships and decides when they
Noximilien 31:becb8f6bf7b7 157 * should fire blasts.
Noximilien 31:becb8f6bf7b7 158 */
Noximilien 21:0eb394495b8a 159 void updateAndDrawEnemies() {
Noximilien 21:0eb394495b8a 160 for (int i = 0; i < max_enemies; ++i) {
Noximilien 21:0eb394495b8a 161 if (enemies[i].active){
Noximilien 21:0eb394495b8a 162 enemies[i].updateAndDraw();
Noximilien 21:0eb394495b8a 163
Noximilien 21:0eb394495b8a 164 // Spawn blast on enemy if counter is ready
Noximilien 21:0eb394495b8a 165 enemies[i].blast_countdown -= 1;
Noximilien 21:0eb394495b8a 166 if (enemies[i].blast_countdown <= 0) {
Noximilien 21:0eb394495b8a 167 bool fired = fireEnemyBlast(enemies[i]);
Noximilien 21:0eb394495b8a 168 if (fired) {
Noximilien 26:676874c42883 169 enemies[i].blast_countdown = 20;
Noximilien 21:0eb394495b8a 170 }
Noximilien 21:0eb394495b8a 171 }
Noximilien 21:0eb394495b8a 172 }
Noximilien 21:0eb394495b8a 173 }
Noximilien 21:0eb394495b8a 174 }
Noximilien 31:becb8f6bf7b7 175
Noximilien 31:becb8f6bf7b7 176 /**
Noximilien 31:becb8f6bf7b7 177 * @brief Spawns a blast at the position of given enemy.
Noximilien 31:becb8f6bf7b7 178 * @param enemy (const Enemy&)
Noximilien 31:becb8f6bf7b7 179 */
Noximilien 21:0eb394495b8a 180 bool fireEnemyBlast(const Enemy& enemy) {
Noximilien 21:0eb394495b8a 181 int found = -1;
Noximilien 21:0eb394495b8a 182 for (int i = 0; i < max_enemy_blasts; ++i) {
Noximilien 21:0eb394495b8a 183 if (!enemy_blasts[i].active) {
Noximilien 21:0eb394495b8a 184 found = i;
Noximilien 21:0eb394495b8a 185 break;
Noximilien 21:0eb394495b8a 186 }
Noximilien 21:0eb394495b8a 187 }
Noximilien 21:0eb394495b8a 188 if (found != -1) {
Noximilien 21:0eb394495b8a 189 enemy_blasts[found].active = true;
Noximilien 21:0eb394495b8a 190 enemy_blasts[found].pos.x = enemy.pos.x;
Noximilien 21:0eb394495b8a 191 enemy_blasts[found].pos.y = enemy.pos.y + enemy2_height / 2;
Noximilien 23:240bc00ef25b 192 gamepad.tone(500,0.1);
Noximilien 21:0eb394495b8a 193 return true;
Noximilien 21:0eb394495b8a 194 }
Noximilien 21:0eb394495b8a 195 return false;
Noximilien 21:0eb394495b8a 196 }
Noximilien 31:becb8f6bf7b7 197 /**
Noximilien 31:becb8f6bf7b7 198 * @brief Moves and draws all active blasts.
Noximilien 31:becb8f6bf7b7 199 */
Noximilien 21:0eb394495b8a 200 void updateAndDrawEnemyBlasts() {
Noximilien 21:0eb394495b8a 201 for (int i = 0; i < max_enemy_blasts; ++i) {
Noximilien 21:0eb394495b8a 202 if (enemy_blasts[i].active) {
Noximilien 21:0eb394495b8a 203 enemy_blasts[i].pos.x -= enemy_blast_speed;
Noximilien 21:0eb394495b8a 204 if (enemy_blasts[i].pos.x <= -1){
Noximilien 21:0eb394495b8a 205 enemy_blasts[i].active = false;
Noximilien 21:0eb394495b8a 206 }
Noximilien 21:0eb394495b8a 207 // Blast is a line 3 pixels wide
Noximilien 21:0eb394495b8a 208 lcd.setPixel(enemy_blasts[i].pos.x, enemy_blasts[i].pos.y, 1);
Noximilien 21:0eb394495b8a 209 lcd.setPixel(enemy_blasts[i].pos.x-1, enemy_blasts[i].pos.y, 1);
Noximilien 21:0eb394495b8a 210 lcd.setPixel(enemy_blasts[i].pos.x-2, enemy_blasts[i].pos.y, 1);
Noximilien 21:0eb394495b8a 211 }
Noximilien 21:0eb394495b8a 212 }
Noximilien 25:749f1efc31fc 213 }
Noximilien 21:0eb394495b8a 214 };
Noximilien 21:0eb394495b8a 215
Noximilien 21:0eb394495b8a 216 #endif