Initial publish

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

Committer:
Noximilien
Date:
Mon Apr 08 14:41:57 2019 +0000
Revision:
27:f05f4e738ba9
Parent:
26:676874c42883
Child:
28:35af3843de8f
I have created "press START" for the intro pause. Added more comments for the report. Fixed the bug I had in my small star function. Changed some drawsprite functions to new one I made. Slightly simplified the code.

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 26:676874c42883 8 extern int enemy_speed = 1;
Noximilien 26:676874c42883 9 extern int enemy_blast_speed = 3;
Noximilien 26:676874c42883 10 const int max_enemies = 4;
Noximilien 26:676874c42883 11 const int max_enemy_blasts = max_enemies*2;
Noximilien 21:0eb394495b8a 12
Noximilien 23:240bc00ef25b 13
Noximilien 24:0570cb4b92d7 14 /**@brief
Noximilien 24:0570cb4b92d7 15 * This is a class to describe the states of one enemy ship
Noximilien 24:0570cb4b92d7 16 */
Noximilien 21:0eb394495b8a 17 class Enemy : public GameObject {
Noximilien 21:0eb394495b8a 18 public:
Noximilien 27:f05f4e738ba9 19 /**This function spawns an enemy on the right side of the screen at the
Noximilien 23:240bc00ef25b 20 * x-direction LCD limit(84) and at random position in the y-direction.
Noximilien 23:240bc00ef25b 21 */
Noximilien 21:0eb394495b8a 22 void spawn() {
Noximilien 23:240bc00ef25b 23 // giving the enemy the spawning positions
Noximilien 21:0eb394495b8a 24 Point spawn_pos(screen_width, game_area_y + rand() % (game_area_height - enemy2_height));
Noximilien 21:0eb394495b8a 25 GameObject::spawn(spawn_pos);
Noximilien 21:0eb394495b8a 26 dead = false;
Noximilien 21:0eb394495b8a 27 dead_counter = 0;
Noximilien 21:0eb394495b8a 28 blast_countdown = 0;
Noximilien 21:0eb394495b8a 29 }
Noximilien 27:f05f4e738ba9 30 /** This is a death function of an nemy when the the collision between the
Noximilien 23:240bc00ef25b 31 * player blast and enemy ship is true. It sets the enemy ship to not active.
Noximilien 23:240bc00ef25b 32 */
Noximilien 21:0eb394495b8a 33 void die() {
Noximilien 27:f05f4e738ba9 34 gamepad.tone(87,0.1);
Noximilien 27:f05f4e738ba9 35 gamepad.tone(187,0.2);
Noximilien 27:f05f4e738ba9 36 gamepad.tone(123,0.3);
Noximilien 21:0eb394495b8a 37 dead = true;
Noximilien 21:0eb394495b8a 38 dead_counter = 3;
Noximilien 21:0eb394495b8a 39 }
Noximilien 27:f05f4e738ba9 40 /** This function draws each individual enemy ship on the screen.
Noximilien 24:0570cb4b92d7 41 */
Noximilien 21:0eb394495b8a 42 void updateAndDraw() {
Noximilien 21:0eb394495b8a 43 pos.x -= enemy_speed;
Noximilien 21:0eb394495b8a 44 if (!dead) {
Noximilien 21:0eb394495b8a 45 drawSprite(pos, enemy_sprite);
Noximilien 21:0eb394495b8a 46 } else {
Noximilien 21:0eb394495b8a 47 updateAndDrawDeathExplosion();
Noximilien 21:0eb394495b8a 48 }
Noximilien 21:0eb394495b8a 49 if (pos.x < 0) {
Noximilien 26:676874c42883 50 game_score -= 50;
Noximilien 26:676874c42883 51 score_count_for_difficulty -= 50;
Noximilien 21:0eb394495b8a 52 active = false;
Noximilien 21:0eb394495b8a 53 }
Noximilien 21:0eb394495b8a 54 }
Noximilien 27:f05f4e738ba9 55 /** This is an explosion function that draws the enemy ships explosion sprites
Noximilien 24:0570cb4b92d7 56 * when the player's shot hits it/
Noximilien 24:0570cb4b92d7 57 */
Noximilien 21:0eb394495b8a 58 void updateAndDrawDeathExplosion() {
Noximilien 21:0eb394495b8a 59 if (dead_counter > 0) {
Noximilien 21:0eb394495b8a 60 dead_counter--;
Noximilien 21:0eb394495b8a 61 if (dead_counter == 2){
Noximilien 21:0eb394495b8a 62 drawSprite(pos, enemy_half_exploded_sprite);
Noximilien 21:0eb394495b8a 63 } else if (dead_counter == 1){
Noximilien 21:0eb394495b8a 64 drawSprite(pos, enemy_exploded_sprite);
Noximilien 21:0eb394495b8a 65 }
Noximilien 21:0eb394495b8a 66 } else {
Noximilien 21:0eb394495b8a 67 active = false;
Noximilien 21:0eb394495b8a 68 }
Noximilien 21:0eb394495b8a 69 }
Noximilien 21:0eb394495b8a 70
Noximilien 21:0eb394495b8a 71 bool dead;
Noximilien 21:0eb394495b8a 72 int dead_counter;
Noximilien 21:0eb394495b8a 73 int blast_countdown;
Noximilien 21:0eb394495b8a 74 };
Noximilien 21:0eb394495b8a 75
Noximilien 23:240bc00ef25b 76
Noximilien 24:0570cb4b92d7 77 /**@brief
Noximilien 24:0570cb4b92d7 78 * This class describes the states and actions of several enemy ships, including
Noximilien 24:0570cb4b92d7 79 * random position generation (y - position) and enemy ship shooting drawing (also describing
Noximilien 24:0570cb4b92d7 80 * intervals between shots).
Noximilien 24:0570cb4b92d7 81 */
Noximilien 21:0eb394495b8a 82 class Enemies {
Noximilien 21:0eb394495b8a 83 public:
Noximilien 23:240bc00ef25b 84
Noximilien 23:240bc00ef25b 85 Enemy enemy_blasts[max_enemy_blasts];
Noximilien 23:240bc00ef25b 86 Enemy enemies[max_enemies];
Noximilien 23:240bc00ef25b 87 CircleBounds enemy_bounds;
Noximilien 23:240bc00ef25b 88 CircleBounds enemy_blast_bounds;
Noximilien 23:240bc00ef25b 89
Noximilien 21:0eb394495b8a 90 Enemies () {
Noximilien 21:0eb394495b8a 91 enemy_bounds.center.x = 5;
Noximilien 21:0eb394495b8a 92 enemy_bounds.center.y = 3;
Noximilien 26:676874c42883 93 enemy_bounds.radius = 6;
Noximilien 21:0eb394495b8a 94
Noximilien 21:0eb394495b8a 95 enemy_blast_bounds.center.x = 0;
Noximilien 21:0eb394495b8a 96 enemy_blast_bounds.center.y = 1;
Noximilien 21:0eb394495b8a 97 enemy_blast_bounds.radius = 1;
Noximilien 21:0eb394495b8a 98 }
Noximilien 27:f05f4e738ba9 99 /** This function spawns a new enemy when there is a free spance in the enemy aray.
Noximilien 26:676874c42883 100 */
Noximilien 21:0eb394495b8a 101 void spawnNewEnemy() {
Noximilien 21:0eb394495b8a 102 int found = -1;
Noximilien 21:0eb394495b8a 103 for (int i = 0; i < max_enemies; ++i) {
Noximilien 21:0eb394495b8a 104 if (!enemies[i].active) {
Noximilien 21:0eb394495b8a 105 found = i;
Noximilien 21:0eb394495b8a 106 break;
Noximilien 21:0eb394495b8a 107 }
Noximilien 21:0eb394495b8a 108 }
Noximilien 21:0eb394495b8a 109
Noximilien 21:0eb394495b8a 110 if (found != -1) {
Noximilien 21:0eb394495b8a 111 enemies[found].spawn();
Noximilien 21:0eb394495b8a 112 }
Noximilien 21:0eb394495b8a 113 }
Noximilien 27:f05f4e738ba9 114 /** This function draws the enemy ships and enemy blasts whenever they are
Noximilien 26:676874c42883 115 * avaialbe to move. Also, it limits the fire rate of the enemy ships.
Noximilien 26:676874c42883 116 */
Noximilien 21:0eb394495b8a 117 void updateAndDrawEnemies() {
Noximilien 21:0eb394495b8a 118 for (int i = 0; i < max_enemies; ++i) {
Noximilien 21:0eb394495b8a 119 if (enemies[i].active){
Noximilien 21:0eb394495b8a 120 enemies[i].updateAndDraw();
Noximilien 21:0eb394495b8a 121
Noximilien 21:0eb394495b8a 122 // Spawn blast on enemy if counter is ready
Noximilien 21:0eb394495b8a 123 enemies[i].blast_countdown -= 1;
Noximilien 21:0eb394495b8a 124 if (enemies[i].blast_countdown <= 0) {
Noximilien 21:0eb394495b8a 125 bool fired = fireEnemyBlast(enemies[i]);
Noximilien 21:0eb394495b8a 126 if (fired) {
Noximilien 26:676874c42883 127 enemies[i].blast_countdown = 20;
Noximilien 21:0eb394495b8a 128 }
Noximilien 21:0eb394495b8a 129 }
Noximilien 21:0eb394495b8a 130 }
Noximilien 21:0eb394495b8a 131 }
Noximilien 21:0eb394495b8a 132 }
Noximilien 27:f05f4e738ba9 133 /** This function fires a blast whenever it is free in the blast array.
Noximilien 26:676874c42883 134 * If the blast is free to be shot, it will become active and will get the.
Noximilien 26:676874c42883 135 * positions of x and y in front of the enemy ship
Noximilien 26:676874c42883 136 */
Noximilien 21:0eb394495b8a 137 bool fireEnemyBlast(const Enemy& enemy) {
Noximilien 21:0eb394495b8a 138 int found = -1;
Noximilien 21:0eb394495b8a 139 for (int i = 0; i < max_enemy_blasts; ++i) {
Noximilien 21:0eb394495b8a 140 if (!enemy_blasts[i].active) {
Noximilien 21:0eb394495b8a 141 found = i;
Noximilien 21:0eb394495b8a 142 break;
Noximilien 21:0eb394495b8a 143 }
Noximilien 21:0eb394495b8a 144 }
Noximilien 21:0eb394495b8a 145 if (found != -1) {
Noximilien 21:0eb394495b8a 146 enemy_blasts[found].active = true;
Noximilien 21:0eb394495b8a 147 enemy_blasts[found].pos.x = enemy.pos.x;
Noximilien 21:0eb394495b8a 148 enemy_blasts[found].pos.y = enemy.pos.y + enemy2_height / 2;
Noximilien 23:240bc00ef25b 149 gamepad.tone(500,0.1);
Noximilien 21:0eb394495b8a 150 return true;
Noximilien 21:0eb394495b8a 151 }
Noximilien 21:0eb394495b8a 152 return false;
Noximilien 21:0eb394495b8a 153 }
Noximilien 27:f05f4e738ba9 154 /** Whenever the blast is active, this function draws the blast accross the
Noximilien 27:f05f4e738ba9 155 * x- direction of the screen until it reaches the left screen limit and then
Noximilien 26:676874c42883 156 * becomes inactive, therefore freeing a space in the blast array.
Noximilien 26:676874c42883 157 */
Noximilien 21:0eb394495b8a 158 void updateAndDrawEnemyBlasts() {
Noximilien 21:0eb394495b8a 159 for (int i = 0; i < max_enemy_blasts; ++i) {
Noximilien 21:0eb394495b8a 160 if (enemy_blasts[i].active) {
Noximilien 21:0eb394495b8a 161 enemy_blasts[i].pos.x -= enemy_blast_speed;
Noximilien 21:0eb394495b8a 162 if (enemy_blasts[i].pos.x <= -1){
Noximilien 21:0eb394495b8a 163 enemy_blasts[i].active = false;
Noximilien 21:0eb394495b8a 164 }
Noximilien 21:0eb394495b8a 165 // Blast is a line 3 pixels wide
Noximilien 21:0eb394495b8a 166 lcd.setPixel(enemy_blasts[i].pos.x, enemy_blasts[i].pos.y, 1);
Noximilien 21:0eb394495b8a 167 lcd.setPixel(enemy_blasts[i].pos.x-1, enemy_blasts[i].pos.y, 1);
Noximilien 21:0eb394495b8a 168 lcd.setPixel(enemy_blasts[i].pos.x-2, enemy_blasts[i].pos.y, 1);
Noximilien 21:0eb394495b8a 169 }
Noximilien 21:0eb394495b8a 170 }
Noximilien 25:749f1efc31fc 171 }
Noximilien 21:0eb394495b8a 172 };
Noximilien 21:0eb394495b8a 173
Noximilien 21:0eb394495b8a 174 #endif