Initial publish
Dependencies: mbed
Fork of el17dg by
game/enemies.h@27:f05f4e738ba9, 2019-04-08 (annotated)
- 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?
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 | 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 |