Initial publish

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

Committer:
Noximilien
Date:
Wed Mar 27 00:00:32 2019 +0000
Revision:
21:0eb394495b8a
Child:
23:240bc00ef25b
switched all enemies functions into the class system in a separate file. Created a struct for writing sprites more easily. Created a function that resets all values when the game is over. Separated collision, gameObject and constants into new files.

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