ELEC2645 (2018/19) / Mbed 2 deprecated el17dg

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

Committer:
Noximilien
Date:
Sun Mar 31 01:04:59 2019 +0000
Revision:
23:240bc00ef25b
Parent:
21:0eb394495b8a
Child:
24:0570cb4b92d7
Made player class and stored everything related to player. Have made stars class. modified player ship movement. created gameOver function and made it using sprites. Created a collision of enemy ship and a player ship function. added more comments.

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 21:0eb394495b8a 6
Noximilien 21:0eb394495b8a 7 const int max_enemies = 1;
Noximilien 21:0eb394495b8a 8 const int enemy_speed = 1;
Noximilien 21:0eb394495b8a 9 const int max_enemy_blasts = max_enemies * 5;
Noximilien 21:0eb394495b8a 10 const int enemy_blast_speed = 5;
Noximilien 21:0eb394495b8a 11
Noximilien 23:240bc00ef25b 12
Noximilien 23:240bc00ef25b 13
Noximilien 21:0eb394495b8a 14 class Enemy : public GameObject {
Noximilien 21:0eb394495b8a 15 public:
Noximilien 23:240bc00ef25b 16 /**@brief
Noximilien 23:240bc00ef25b 17 * This function spawns an enemy on the right side of the screen at the
Noximilien 23:240bc00ef25b 18 * x-direction LCD limit(84) and at random position in the y-direction.
Noximilien 23:240bc00ef25b 19 */
Noximilien 21:0eb394495b8a 20 void spawn() {
Noximilien 23:240bc00ef25b 21 // giving the enemy the spawning positions
Noximilien 21:0eb394495b8a 22 Point spawn_pos(screen_width, game_area_y + rand() % (game_area_height - enemy2_height));
Noximilien 21:0eb394495b8a 23 GameObject::spawn(spawn_pos);
Noximilien 21:0eb394495b8a 24 dead = false;
Noximilien 21:0eb394495b8a 25 dead_counter = 0;
Noximilien 21:0eb394495b8a 26 blast_countdown = 0;
Noximilien 21:0eb394495b8a 27 }
Noximilien 23:240bc00ef25b 28 /**@brief
Noximilien 23:240bc00ef25b 29 * This is a death function of an nemy when the the collision between the
Noximilien 23:240bc00ef25b 30 * player blast and enemy ship is true. It sets the enemy ship to not active.
Noximilien 23:240bc00ef25b 31 */
Noximilien 21:0eb394495b8a 32 void die() {
Noximilien 21:0eb394495b8a 33 dead = true;
Noximilien 21:0eb394495b8a 34 dead_counter = 3;
Noximilien 21:0eb394495b8a 35 }
Noximilien 21:0eb394495b8a 36
Noximilien 21:0eb394495b8a 37 void updateAndDraw() {
Noximilien 21:0eb394495b8a 38 pos.x -= enemy_speed;
Noximilien 21:0eb394495b8a 39 if (!dead) {
Noximilien 21:0eb394495b8a 40 drawSprite(pos, enemy_sprite);
Noximilien 21:0eb394495b8a 41 } else {
Noximilien 21:0eb394495b8a 42 updateAndDrawDeathExplosion();
Noximilien 21:0eb394495b8a 43 }
Noximilien 21:0eb394495b8a 44 if (pos.x < 0) {
Noximilien 21:0eb394495b8a 45 active = false;
Noximilien 21:0eb394495b8a 46 }
Noximilien 21:0eb394495b8a 47 }
Noximilien 21:0eb394495b8a 48
Noximilien 21:0eb394495b8a 49 void updateAndDrawDeathExplosion() {
Noximilien 21:0eb394495b8a 50 if (dead_counter > 0) {
Noximilien 21:0eb394495b8a 51 dead_counter--;
Noximilien 21:0eb394495b8a 52 if (dead_counter == 2){
Noximilien 21:0eb394495b8a 53 drawSprite(pos, enemy_half_exploded_sprite);
Noximilien 21:0eb394495b8a 54 } else if (dead_counter == 1){
Noximilien 21:0eb394495b8a 55 drawSprite(pos, enemy_exploded_sprite);
Noximilien 21:0eb394495b8a 56 }
Noximilien 21:0eb394495b8a 57 } else {
Noximilien 21:0eb394495b8a 58 active = false;
Noximilien 21:0eb394495b8a 59 }
Noximilien 21:0eb394495b8a 60 }
Noximilien 21:0eb394495b8a 61
Noximilien 21:0eb394495b8a 62 bool dead;
Noximilien 21:0eb394495b8a 63 int dead_counter;
Noximilien 21:0eb394495b8a 64 int blast_countdown;
Noximilien 21:0eb394495b8a 65 };
Noximilien 21:0eb394495b8a 66
Noximilien 23:240bc00ef25b 67
Noximilien 23:240bc00ef25b 68
Noximilien 21:0eb394495b8a 69 class Enemies {
Noximilien 21:0eb394495b8a 70 public:
Noximilien 23:240bc00ef25b 71
Noximilien 23:240bc00ef25b 72 Enemy enemy_blasts[max_enemy_blasts];
Noximilien 23:240bc00ef25b 73 Enemy enemies[max_enemies];
Noximilien 23:240bc00ef25b 74 CircleBounds enemy_bounds;
Noximilien 23:240bc00ef25b 75 CircleBounds enemy_blast_bounds;
Noximilien 23:240bc00ef25b 76
Noximilien 21:0eb394495b8a 77 Enemies () {
Noximilien 21:0eb394495b8a 78 enemy_bounds.center.x = 5;
Noximilien 21:0eb394495b8a 79 enemy_bounds.center.y = 3;
Noximilien 21:0eb394495b8a 80 enemy_bounds.radius = 8;
Noximilien 21:0eb394495b8a 81
Noximilien 21:0eb394495b8a 82 enemy_blast_bounds.center.x = 0;
Noximilien 21:0eb394495b8a 83 enemy_blast_bounds.center.y = 1;
Noximilien 21:0eb394495b8a 84 enemy_blast_bounds.radius = 1;
Noximilien 21:0eb394495b8a 85 }
Noximilien 21:0eb394495b8a 86
Noximilien 21:0eb394495b8a 87 void spawnNewEnemy() {
Noximilien 21:0eb394495b8a 88 int found = -1;
Noximilien 21:0eb394495b8a 89 for (int i = 0; i < max_enemies; ++i) {
Noximilien 21:0eb394495b8a 90 if (!enemies[i].active) {
Noximilien 21:0eb394495b8a 91 found = i;
Noximilien 21:0eb394495b8a 92 break;
Noximilien 21:0eb394495b8a 93 }
Noximilien 21:0eb394495b8a 94 }
Noximilien 21:0eb394495b8a 95
Noximilien 21:0eb394495b8a 96 if (found != -1) {
Noximilien 21:0eb394495b8a 97 enemies[found].spawn();
Noximilien 21:0eb394495b8a 98 }
Noximilien 21:0eb394495b8a 99 }
Noximilien 21:0eb394495b8a 100
Noximilien 21:0eb394495b8a 101 void updateAndDrawEnemies() {
Noximilien 21:0eb394495b8a 102 for (int i = 0; i < max_enemies; ++i) {
Noximilien 21:0eb394495b8a 103 if (enemies[i].active){
Noximilien 21:0eb394495b8a 104 enemies[i].updateAndDraw();
Noximilien 21:0eb394495b8a 105
Noximilien 21:0eb394495b8a 106 // Spawn blast on enemy if counter is ready
Noximilien 21:0eb394495b8a 107 enemies[i].blast_countdown -= 1;
Noximilien 21:0eb394495b8a 108 if (enemies[i].blast_countdown <= 0) {
Noximilien 21:0eb394495b8a 109 bool fired = fireEnemyBlast(enemies[i]);
Noximilien 21:0eb394495b8a 110 if (fired) {
Noximilien 21:0eb394495b8a 111 enemies[i].blast_countdown = 10;
Noximilien 21:0eb394495b8a 112 }
Noximilien 21:0eb394495b8a 113 }
Noximilien 21:0eb394495b8a 114 }
Noximilien 21:0eb394495b8a 115 }
Noximilien 21:0eb394495b8a 116 }
Noximilien 21:0eb394495b8a 117
Noximilien 21:0eb394495b8a 118 bool fireEnemyBlast(const Enemy& enemy) {
Noximilien 21:0eb394495b8a 119 int found = -1;
Noximilien 21:0eb394495b8a 120 for (int i = 0; i < max_enemy_blasts; ++i) {
Noximilien 21:0eb394495b8a 121 if (!enemy_blasts[i].active) {
Noximilien 21:0eb394495b8a 122 found = i;
Noximilien 21:0eb394495b8a 123 break;
Noximilien 21:0eb394495b8a 124 }
Noximilien 21:0eb394495b8a 125 }
Noximilien 21:0eb394495b8a 126 if (found != -1) {
Noximilien 21:0eb394495b8a 127 enemy_blasts[found].active = true;
Noximilien 21:0eb394495b8a 128 enemy_blasts[found].pos.x = enemy.pos.x;
Noximilien 21:0eb394495b8a 129 enemy_blasts[found].pos.y = enemy.pos.y + enemy2_height / 2;
Noximilien 23:240bc00ef25b 130 gamepad.tone(500,0.1);
Noximilien 21:0eb394495b8a 131 return true;
Noximilien 21:0eb394495b8a 132 }
Noximilien 21:0eb394495b8a 133 return false;
Noximilien 21:0eb394495b8a 134 }
Noximilien 21:0eb394495b8a 135
Noximilien 21:0eb394495b8a 136 void updateAndDrawEnemyBlasts() {
Noximilien 21:0eb394495b8a 137 for (int i = 0; i < max_enemy_blasts; ++i) {
Noximilien 21:0eb394495b8a 138 if (enemy_blasts[i].active) {
Noximilien 21:0eb394495b8a 139 enemy_blasts[i].pos.x -= enemy_blast_speed;
Noximilien 21:0eb394495b8a 140 if (enemy_blasts[i].pos.x <= -1){
Noximilien 21:0eb394495b8a 141 enemy_blasts[i].active = false;
Noximilien 21:0eb394495b8a 142 }
Noximilien 21:0eb394495b8a 143 // Blast is a line 3 pixels wide
Noximilien 21:0eb394495b8a 144 lcd.setPixel(enemy_blasts[i].pos.x, enemy_blasts[i].pos.y, 1);
Noximilien 21:0eb394495b8a 145 lcd.setPixel(enemy_blasts[i].pos.x-1, enemy_blasts[i].pos.y, 1);
Noximilien 21:0eb394495b8a 146 lcd.setPixel(enemy_blasts[i].pos.x-2, enemy_blasts[i].pos.y, 1);
Noximilien 21:0eb394495b8a 147 }
Noximilien 21:0eb394495b8a 148 }
Noximilien 21:0eb394495b8a 149 }
Noximilien 21:0eb394495b8a 150
Noximilien 21:0eb394495b8a 151 };
Noximilien 21:0eb394495b8a 152
Noximilien 21:0eb394495b8a 153 #endif