Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of el17dg by
game/enemies.h@23:240bc00ef25b, 2019-03-31 (annotated)
- 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?
| 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 | 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 |
