Initial publish
Dependencies: mbed
Fork of el17dg by
game/enemies.h@21:0eb394495b8a, 2019-03-27 (annotated)
- 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?
User | Revision | Line number | New 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 |