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/game.cpp@20:557e84189a57, 2019-03-26 (annotated)
- Committer:
- Noximilien
- Date:
- Tue Mar 26 10:52:53 2019 +0000
- Revision:
- 20:557e84189a57
- Parent:
- 19:b78fa41d04a9
- Child:
- 21:0eb394495b8a
Have made the intro for my game. I need to implement class system again in order to get more marks. Need to a function that will be resetting in game values when the game is over.;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Noximilien | 3:10918b0f7a7d | 1 | |
| Noximilien | 3:10918b0f7a7d | 2 | |
| Noximilien | 3:10918b0f7a7d | 3 | #include "mbed.h" |
| Noximilien | 3:10918b0f7a7d | 4 | #include "N5110.h" |
| Noximilien | 3:10918b0f7a7d | 5 | #include "Gamepad.h" |
| Noximilien | 3:10918b0f7a7d | 6 | |
| Noximilien | 3:10918b0f7a7d | 7 | #include "models.h" |
| Noximilien | 4:02c63aaa2df9 | 8 | #include "main.h" |
| Noximilien | 4:02c63aaa2df9 | 9 | #include "game.h" |
| Noximilien | 5:2b9181bc5c89 | 10 | |
| Noximilien | 20:557e84189a57 | 11 | |
| Noximilien | 5:2b9181bc5c89 | 12 | int x_ship_pos = 0; |
| Noximilien | 5:2b9181bc5c89 | 13 | int y_ship_pos = 24; |
| Noximilien | 11:cf2ba52e8b7e | 14 | int small_star_delay = 0; |
| Noximilien | 16:b7d0cac561cc | 15 | int enemy_blast_delay = 0; |
| Noximilien | 16:b7d0cac561cc | 16 | int game_score = 0; |
| Noximilien | 7:42376925945c | 17 | |
| Noximilien | 8:c18c240665aa | 18 | const int ship_speed = 2; |
| Noximilien | 11:cf2ba52e8b7e | 19 | const int small_star_delay_max = 3; |
| Noximilien | 16:b7d0cac561cc | 20 | const int enemy_blast_delay_max = 5; |
| Noximilien | 6:100b46be4bea | 21 | |
| Noximilien | 16:b7d0cac561cc | 22 | int player_lifes = 3; |
| Noximilien | 19:b78fa41d04a9 | 23 | bool red_led_state = false; |
| Noximilien | 19:b78fa41d04a9 | 24 | int red_led_flashing = 0; |
| Noximilien | 20:557e84189a57 | 25 | |
| Noximilien | 12:bfe3a3deaac3 | 26 | |
| Noximilien | 19:b78fa41d04a9 | 27 | bool game_over = false; |
| Noximilien | 19:b78fa41d04a9 | 28 | |
| Noximilien | 20:557e84189a57 | 29 | /*void Game::gameValuesInit(){ |
| Noximilien | 20:557e84189a57 | 30 | x_ship_pos = 0; |
| Noximilien | 20:557e84189a57 | 31 | y_ship_pos = 24; |
| Noximilien | 20:557e84189a57 | 32 | small_star_delay = 0; |
| Noximilien | 20:557e84189a57 | 33 | enemy_blast_delay = 0; |
| Noximilien | 20:557e84189a57 | 34 | game_score = 0; |
| Noximilien | 20:557e84189a57 | 35 | |
| Noximilien | 20:557e84189a57 | 36 | player_lifes = 3; |
| Noximilien | 20:557e84189a57 | 37 | red_led_state = false; |
| Noximilien | 20:557e84189a57 | 38 | red_led_flashing = 0; |
| Noximilien | 20:557e84189a57 | 39 | |
| Noximilien | 20:557e84189a57 | 40 | game_over = false; |
| Noximilien | 20:557e84189a57 | 41 | |
| Noximilien | 20:557e84189a57 | 42 | };*/ |
| Noximilien | 20:557e84189a57 | 43 | |
| Noximilien | 12:bfe3a3deaac3 | 44 | struct GameObject { |
| Noximilien | 12:bfe3a3deaac3 | 45 | int x; |
| Noximilien | 12:bfe3a3deaac3 | 46 | int y; |
| Noximilien | 12:bfe3a3deaac3 | 47 | bool active; |
| Noximilien | 12:bfe3a3deaac3 | 48 | }; |
| Noximilien | 9:5ad5501c702e | 49 | |
| Noximilien | 12:bfe3a3deaac3 | 50 | struct Enemy : public GameObject { |
| Noximilien | 12:bfe3a3deaac3 | 51 | bool dead; |
| Noximilien | 12:bfe3a3deaac3 | 52 | int dead_counter; |
| Noximilien | 12:bfe3a3deaac3 | 53 | }; |
| Noximilien | 12:bfe3a3deaac3 | 54 | |
| Noximilien | 20:557e84189a57 | 55 | |
| Noximilien | 20:557e84189a57 | 56 | const float player_collision_radius = 8; |
| Noximilien | 20:557e84189a57 | 57 | const float player_collision_offset_x = 5; |
| Noximilien | 20:557e84189a57 | 58 | const float player_collision_offset_y = 7; |
| Noximilien | 12:bfe3a3deaac3 | 59 | #define MAX_BLASTS (5) |
| Noximilien | 12:bfe3a3deaac3 | 60 | GameObject blasts[MAX_BLASTS]; |
| Noximilien | 16:b7d0cac561cc | 61 | GameObject enemy_blasts[MAX_BLASTS]; |
| Noximilien | 12:bfe3a3deaac3 | 62 | const float blast_collision_radius = 1; |
| Noximilien | 12:bfe3a3deaac3 | 63 | const float blast_collision_offset_x = 1; |
| Noximilien | 12:bfe3a3deaac3 | 64 | const float blast_collision_offset_y = 0; |
| Noximilien | 12:bfe3a3deaac3 | 65 | |
| Noximilien | 12:bfe3a3deaac3 | 66 | #define MAX_SMALL_STARS (5) |
| Noximilien | 13:5c3dc6e827c2 | 67 | GameObject small_stars[MAX_SMALL_STARS]; |
| Noximilien | 12:bfe3a3deaac3 | 68 | |
| Noximilien | 12:bfe3a3deaac3 | 69 | #define MAX_MEDIUM_STARS (10) |
| Noximilien | 13:5c3dc6e827c2 | 70 | GameObject medium_stars[MAX_MEDIUM_STARS]; |
| Noximilien | 11:cf2ba52e8b7e | 71 | |
| Noximilien | 12:bfe3a3deaac3 | 72 | #define MAX_ENEMIES (1) |
| Noximilien | 12:bfe3a3deaac3 | 73 | Enemy enemies[MAX_ENEMIES]; |
| Noximilien | 12:bfe3a3deaac3 | 74 | const float enemy_collision_radius = 8; |
| Noximilien | 12:bfe3a3deaac3 | 75 | const float enemy_collision_offset_x = 5; |
| Noximilien | 12:bfe3a3deaac3 | 76 | const float enemy_collision_offset_y = 3; |
| Noximilien | 12:bfe3a3deaac3 | 77 | |
| Noximilien | 12:bfe3a3deaac3 | 78 | |
| Noximilien | 12:bfe3a3deaac3 | 79 | GameObject player; |
| Noximilien | 12:bfe3a3deaac3 | 80 | |
| Noximilien | 12:bfe3a3deaac3 | 81 | void spawnNewEnemy() { |
| Noximilien | 12:bfe3a3deaac3 | 82 | int found = -1; |
| Noximilien | 12:bfe3a3deaac3 | 83 | for (int i = 0; i < MAX_ENEMIES; ++i) { |
| Noximilien | 12:bfe3a3deaac3 | 84 | if (!enemies[i].active) { |
| Noximilien | 12:bfe3a3deaac3 | 85 | found = i; |
| Noximilien | 12:bfe3a3deaac3 | 86 | break; |
| Noximilien | 12:bfe3a3deaac3 | 87 | } |
| Noximilien | 12:bfe3a3deaac3 | 88 | } |
| Noximilien | 12:bfe3a3deaac3 | 89 | |
| Noximilien | 12:bfe3a3deaac3 | 90 | if (found != -1) { |
| Noximilien | 12:bfe3a3deaac3 | 91 | enemies[found].dead = false; |
| Noximilien | 12:bfe3a3deaac3 | 92 | enemies[found].active = true; |
| Noximilien | 12:bfe3a3deaac3 | 93 | enemies[found].x = screen_width; |
| Noximilien | 17:69a85c909566 | 94 | enemies[found].y = (game_score_height + enemy2_height/2) + rand()% (screen_height - enemy2_height*2 - game_score_height); |
| Noximilien | 12:bfe3a3deaac3 | 95 | |
| Noximilien | 12:bfe3a3deaac3 | 96 | } |
| Noximilien | 12:bfe3a3deaac3 | 97 | } |
| Noximilien | 12:bfe3a3deaac3 | 98 | |
| Noximilien | 12:bfe3a3deaac3 | 99 | void updateAndDrawEnemies() { |
| Noximilien | 17:69a85c909566 | 100 | const int enemy_speed = 1; |
| Noximilien | 12:bfe3a3deaac3 | 101 | for (int i = 0; i < MAX_ENEMIES; ++i) { |
| Noximilien | 12:bfe3a3deaac3 | 102 | if (enemies[i].active){ |
| Noximilien | 12:bfe3a3deaac3 | 103 | enemies[i].x -= enemy_speed; |
| Noximilien | 12:bfe3a3deaac3 | 104 | if (!enemies[i].dead) { |
| Noximilien | 12:bfe3a3deaac3 | 105 | lcd.drawSprite(enemies[i].x, enemies[i].y, 7, 11, (int*)enemyShip2); |
| Noximilien | 14:e8de27c4d0d4 | 106 | } |
| Noximilien | 14:e8de27c4d0d4 | 107 | if (enemies[i].x < 0){ |
| Noximilien | 14:e8de27c4d0d4 | 108 | enemies[i].active = false; |
| Noximilien | 14:e8de27c4d0d4 | 109 | } |
| Noximilien | 14:e8de27c4d0d4 | 110 | else { |
| Noximilien | 12:bfe3a3deaac3 | 111 | if (enemies[i].dead_counter > 0) { |
| Noximilien | 12:bfe3a3deaac3 | 112 | enemies[i].dead_counter--; |
| Noximilien | 14:e8de27c4d0d4 | 113 | if (enemies[i].dead_counter == 2){ |
| Noximilien | 14:e8de27c4d0d4 | 114 | lcd.drawSprite(enemies[i].x, enemies[i].y, 7, 11, (int*)enemyHalfExploded); |
| Noximilien | 14:e8de27c4d0d4 | 115 | } |
| Noximilien | 14:e8de27c4d0d4 | 116 | else if (enemies[i].dead_counter == 1){ |
| Noximilien | 14:e8de27c4d0d4 | 117 | lcd.drawSprite(enemies[i].x, enemies[i].y, 7, 11, (int*)enemyExploded); |
| Noximilien | 14:e8de27c4d0d4 | 118 | game_score += 30; |
| Noximilien | 14:e8de27c4d0d4 | 119 | } |
| Noximilien | 14:e8de27c4d0d4 | 120 | else { |
| Noximilien | 12:bfe3a3deaac3 | 121 | enemies[i].active = false; |
| Noximilien | 12:bfe3a3deaac3 | 122 | } |
| Noximilien | 12:bfe3a3deaac3 | 123 | } |
| Noximilien | 12:bfe3a3deaac3 | 124 | } |
| Noximilien | 12:bfe3a3deaac3 | 125 | } |
| Noximilien | 12:bfe3a3deaac3 | 126 | } |
| Noximilien | 12:bfe3a3deaac3 | 127 | } |
| Noximilien | 12:bfe3a3deaac3 | 128 | |
| Noximilien | 12:bfe3a3deaac3 | 129 | void updateAndDrawBlasts() { |
| Noximilien | 12:bfe3a3deaac3 | 130 | const int blast_speed = 5; |
| Noximilien | 12:bfe3a3deaac3 | 131 | for (int i = 0; i < MAX_BLASTS; ++i) { |
| Noximilien | 12:bfe3a3deaac3 | 132 | if (blasts[i].active) { |
| Noximilien | 12:bfe3a3deaac3 | 133 | blasts[i].x += blast_speed; |
| Noximilien | 12:bfe3a3deaac3 | 134 | if (blasts[i].x >= screen_width){ |
| Noximilien | 12:bfe3a3deaac3 | 135 | blasts[i].active = false; |
| Noximilien | 12:bfe3a3deaac3 | 136 | } |
| Noximilien | 12:bfe3a3deaac3 | 137 | lcd.setPixel(blasts[i].x, blasts[i].y, 1); |
| Noximilien | 12:bfe3a3deaac3 | 138 | lcd.setPixel(blasts[i].x+1, blasts[i].y, 1); |
| Noximilien | 12:bfe3a3deaac3 | 139 | lcd.setPixel(blasts[i].x+2, blasts[i].y, 1); |
| Noximilien | 12:bfe3a3deaac3 | 140 | } |
| Noximilien | 12:bfe3a3deaac3 | 141 | } |
| Noximilien | 12:bfe3a3deaac3 | 142 | } |
| Noximilien | 12:bfe3a3deaac3 | 143 | |
| Noximilien | 16:b7d0cac561cc | 144 | void fireNewEnemyBlast() { |
| Noximilien | 16:b7d0cac561cc | 145 | // Search the array of blasts if inactive we can use it. |
| Noximilien | 16:b7d0cac561cc | 146 | int found = -1; |
| Noximilien | 16:b7d0cac561cc | 147 | for (int i = 0; i < MAX_BLASTS; ++i) { |
| Noximilien | 16:b7d0cac561cc | 148 | if (!enemy_blasts[i].active) { |
| Noximilien | 16:b7d0cac561cc | 149 | found = i; |
| Noximilien | 16:b7d0cac561cc | 150 | break; |
| Noximilien | 16:b7d0cac561cc | 151 | } |
| Noximilien | 16:b7d0cac561cc | 152 | } |
| Noximilien | 16:b7d0cac561cc | 153 | |
| Noximilien | 16:b7d0cac561cc | 154 | if (found != -1) { /////////////////////////////////////////////////// |
| Noximilien | 16:b7d0cac561cc | 155 | enemy_blasts[found].active = true; |
| Noximilien | 16:b7d0cac561cc | 156 | enemy_blasts[found].x = enemies[found].x; |
| Noximilien | 16:b7d0cac561cc | 157 | enemy_blasts[found].y = enemies[found].y + (enemy2_height/2); |
| Noximilien | 16:b7d0cac561cc | 158 | } |
| Noximilien | 16:b7d0cac561cc | 159 | } |
| Noximilien | 16:b7d0cac561cc | 160 | |
| Noximilien | 16:b7d0cac561cc | 161 | void updateAndDrawEnemyBlasts() { |
| Noximilien | 16:b7d0cac561cc | 162 | const int blast_speed = 5; |
| Noximilien | 16:b7d0cac561cc | 163 | for (int i = 0; i < MAX_BLASTS; ++i) { |
| Noximilien | 16:b7d0cac561cc | 164 | if (enemy_blasts[i].active) { |
| Noximilien | 16:b7d0cac561cc | 165 | enemy_blasts[i].x -= blast_speed; |
| Noximilien | 16:b7d0cac561cc | 166 | if (enemy_blasts[i].x <= -1){ |
| Noximilien | 16:b7d0cac561cc | 167 | enemy_blasts[i].active = false; |
| Noximilien | 16:b7d0cac561cc | 168 | } |
| Noximilien | 16:b7d0cac561cc | 169 | lcd.setPixel(enemy_blasts[i].x, enemy_blasts[i].y, 1); |
| Noximilien | 16:b7d0cac561cc | 170 | lcd.setPixel(enemy_blasts[i].x-1, enemy_blasts[i].y, 1); |
| Noximilien | 16:b7d0cac561cc | 171 | lcd.setPixel(enemy_blasts[i].x-2, enemy_blasts[i].y, 1); |
| Noximilien | 16:b7d0cac561cc | 172 | } |
| Noximilien | 16:b7d0cac561cc | 173 | } |
| Noximilien | 16:b7d0cac561cc | 174 | } |
| Noximilien | 16:b7d0cac561cc | 175 | |
| Noximilien | 12:bfe3a3deaac3 | 176 | void fireNewBlast() { |
| Noximilien | 12:bfe3a3deaac3 | 177 | // Search the array of blasts if inactive we can use it. |
| Noximilien | 12:bfe3a3deaac3 | 178 | int found = -1; |
| Noximilien | 12:bfe3a3deaac3 | 179 | for (int i = 0; i < MAX_BLASTS; ++i) { |
| Noximilien | 12:bfe3a3deaac3 | 180 | if (!blasts[i].active) { |
| Noximilien | 12:bfe3a3deaac3 | 181 | found = i; |
| Noximilien | 12:bfe3a3deaac3 | 182 | break; |
| Noximilien | 12:bfe3a3deaac3 | 183 | } |
| Noximilien | 12:bfe3a3deaac3 | 184 | } |
| Noximilien | 12:bfe3a3deaac3 | 185 | |
| Noximilien | 12:bfe3a3deaac3 | 186 | if (found != -1) { |
| Noximilien | 12:bfe3a3deaac3 | 187 | blasts[found].active = true; |
| Noximilien | 12:bfe3a3deaac3 | 188 | blasts[found].x = x_ship_pos + spaceship1_width; |
| Noximilien | 12:bfe3a3deaac3 | 189 | blasts[found].y = y_ship_pos + (spaceship1_height/2); |
| Noximilien | 12:bfe3a3deaac3 | 190 | } |
| Noximilien | 12:bfe3a3deaac3 | 191 | } |
| Noximilien | 12:bfe3a3deaac3 | 192 | |
| Noximilien | 12:bfe3a3deaac3 | 193 | inline bool circleCollideTwoObjects( |
| Noximilien | 12:bfe3a3deaac3 | 194 | int x1, int y1, float r1, float offset_x1, float offset_y1, |
| Noximilien | 16:b7d0cac561cc | 195 | int x2, int y2, float r2, float offset_x2, float offset_y2) { |
| Noximilien | 16:b7d0cac561cc | 196 | |
| Noximilien | 16:b7d0cac561cc | 197 | int distance = pow((x1 + offset_x1) - (x2 + offset_x2), 2) + pow((y1 + offset_y1) - (y2 + offset_y2), 2); |
| Noximilien | 16:b7d0cac561cc | 198 | return distance <= pow(r1 + r2, 2); |
| Noximilien | 12:bfe3a3deaac3 | 199 | } |
| Noximilien | 12:bfe3a3deaac3 | 200 | |
| Noximilien | 12:bfe3a3deaac3 | 201 | void collideEnemiesAndBlasts() { |
| Noximilien | 12:bfe3a3deaac3 | 202 | for (int i = 0; i < MAX_ENEMIES; ++i) { |
| Noximilien | 12:bfe3a3deaac3 | 203 | for (int j = 0; j < MAX_BLASTS; ++j) { |
| Noximilien | 12:bfe3a3deaac3 | 204 | if (enemies[i].active && !enemies[i].dead && blasts[j].active) { |
| Noximilien | 12:bfe3a3deaac3 | 205 | bool collision = circleCollideTwoObjects( |
| Noximilien | 12:bfe3a3deaac3 | 206 | enemies[i].x, enemies[i].y, enemy_collision_radius, enemy_collision_offset_x, enemy_collision_offset_y, |
| Noximilien | 12:bfe3a3deaac3 | 207 | blasts[j].x, blasts[j].y, blast_collision_radius, blast_collision_offset_x, blast_collision_offset_y |
| Noximilien | 12:bfe3a3deaac3 | 208 | ); |
| Noximilien | 12:bfe3a3deaac3 | 209 | if (collision) { |
| Noximilien | 12:bfe3a3deaac3 | 210 | enemies[i].dead = true; |
| Noximilien | 12:bfe3a3deaac3 | 211 | enemies[i].dead_counter = 3; |
| Noximilien | 12:bfe3a3deaac3 | 212 | blasts[j].active = false; |
| Noximilien | 12:bfe3a3deaac3 | 213 | } |
| Noximilien | 12:bfe3a3deaac3 | 214 | } |
| Noximilien | 12:bfe3a3deaac3 | 215 | } |
| Noximilien | 12:bfe3a3deaac3 | 216 | } |
| Noximilien | 12:bfe3a3deaac3 | 217 | } |
| Noximilien | 5:2b9181bc5c89 | 218 | |
| Noximilien | 18:6becc9f9de5e | 219 | void collideEnemiesBlastsAndPlayer() { |
| Noximilien | 18:6becc9f9de5e | 220 | for (int i = 0; i < MAX_ENEMIES; ++i) { |
| Noximilien | 18:6becc9f9de5e | 221 | for (int j = 0; j < MAX_BLASTS; ++j) { |
| Noximilien | 18:6becc9f9de5e | 222 | if (enemies[i].active && enemy_blasts[j].active) { |
| Noximilien | 18:6becc9f9de5e | 223 | bool collision = circleCollideTwoObjects( |
| Noximilien | 18:6becc9f9de5e | 224 | x_ship_pos, y_ship_pos, player_collision_radius, player_collision_offset_x, player_collision_offset_y, |
| Noximilien | 18:6becc9f9de5e | 225 | enemy_blasts[j].x, enemy_blasts[j].y, blast_collision_radius, blast_collision_offset_x, blast_collision_offset_y |
| Noximilien | 18:6becc9f9de5e | 226 | ); |
| Noximilien | 18:6becc9f9de5e | 227 | if (collision) { |
| Noximilien | 18:6becc9f9de5e | 228 | player_lifes -= 1; |
| Noximilien | 18:6becc9f9de5e | 229 | enemy_blasts[j].active = false; |
| Noximilien | 18:6becc9f9de5e | 230 | } |
| Noximilien | 18:6becc9f9de5e | 231 | } |
| Noximilien | 18:6becc9f9de5e | 232 | } |
| Noximilien | 18:6becc9f9de5e | 233 | } |
| Noximilien | 18:6becc9f9de5e | 234 | } |
| Noximilien | 18:6becc9f9de5e | 235 | |
| Noximilien | 13:5c3dc6e827c2 | 236 | void newSmallStarFlies() { |
| Noximilien | 13:5c3dc6e827c2 | 237 | // Search the array of stars if inactive we can use it. - the same as with blasts |
| Noximilien | 13:5c3dc6e827c2 | 238 | int found = -1; |
| Noximilien | 13:5c3dc6e827c2 | 239 | for (int i = 0; i < MAX_SMALL_STARS; ++i) { |
| Noximilien | 13:5c3dc6e827c2 | 240 | if (!small_stars[i].active) { |
| Noximilien | 13:5c3dc6e827c2 | 241 | found = i; |
| Noximilien | 13:5c3dc6e827c2 | 242 | break; |
| Noximilien | 13:5c3dc6e827c2 | 243 | } |
| Noximilien | 13:5c3dc6e827c2 | 244 | } |
| Noximilien | 13:5c3dc6e827c2 | 245 | |
| Noximilien | 13:5c3dc6e827c2 | 246 | if (found != -1) { |
| Noximilien | 13:5c3dc6e827c2 | 247 | small_stars[found].active = true; |
| Noximilien | 13:5c3dc6e827c2 | 248 | small_stars[found].x = screen_width; |
| Noximilien | 15:0145c5f0bea1 | 249 | small_stars[found].y = rand() % screen_height + game_score_height; |
| Noximilien | 13:5c3dc6e827c2 | 250 | } |
| Noximilien | 13:5c3dc6e827c2 | 251 | } |
| Noximilien | 13:5c3dc6e827c2 | 252 | |
| Noximilien | 13:5c3dc6e827c2 | 253 | void updateAndDrawSmallStars(){ |
| Noximilien | 13:5c3dc6e827c2 | 254 | const int small_star_speed = 5; |
| Noximilien | 13:5c3dc6e827c2 | 255 | for (int i = 0; i < MAX_SMALL_STARS; ++i) { |
| Noximilien | 13:5c3dc6e827c2 | 256 | if (small_stars[i].active) { |
| Noximilien | 13:5c3dc6e827c2 | 257 | small_stars[i].x -= small_star_speed; |
| Noximilien | 13:5c3dc6e827c2 | 258 | if (small_stars[i].x <= 0){ |
| Noximilien | 13:5c3dc6e827c2 | 259 | small_stars[i].active = false; |
| Noximilien | 13:5c3dc6e827c2 | 260 | } |
| Noximilien | 13:5c3dc6e827c2 | 261 | lcd.drawSprite(small_stars[i].x, small_stars[i].y, 3, 3, (int*)starSmall); |
| Noximilien | 13:5c3dc6e827c2 | 262 | } |
| Noximilien | 13:5c3dc6e827c2 | 263 | } |
| Noximilien | 13:5c3dc6e827c2 | 264 | } |
| Noximilien | 13:5c3dc6e827c2 | 265 | |
| Noximilien | 13:5c3dc6e827c2 | 266 | void newMediumStarFlies() { |
| Noximilien | 13:5c3dc6e827c2 | 267 | // Search the array of stars if inactive we can use it. - the same as with blasts |
| Noximilien | 13:5c3dc6e827c2 | 268 | int found = -1; |
| Noximilien | 13:5c3dc6e827c2 | 269 | for (int i = 0; i < MAX_MEDIUM_STARS; ++i) { |
| Noximilien | 13:5c3dc6e827c2 | 270 | if (!medium_stars[i].active) { |
| Noximilien | 13:5c3dc6e827c2 | 271 | found = i; |
| Noximilien | 13:5c3dc6e827c2 | 272 | break; |
| Noximilien | 13:5c3dc6e827c2 | 273 | } |
| Noximilien | 13:5c3dc6e827c2 | 274 | } |
| Noximilien | 13:5c3dc6e827c2 | 275 | |
| Noximilien | 13:5c3dc6e827c2 | 276 | if (found != -1) { |
| Noximilien | 13:5c3dc6e827c2 | 277 | medium_stars[found].active = true; |
| Noximilien | 13:5c3dc6e827c2 | 278 | medium_stars[found].x = screen_width; |
| Noximilien | 15:0145c5f0bea1 | 279 | medium_stars[found].y =rand() % screen_height + game_score_height; |
| Noximilien | 13:5c3dc6e827c2 | 280 | } |
| Noximilien | 13:5c3dc6e827c2 | 281 | } |
| Noximilien | 13:5c3dc6e827c2 | 282 | |
| Noximilien | 13:5c3dc6e827c2 | 283 | void updateAndDrawMediumStars(){ |
| Noximilien | 13:5c3dc6e827c2 | 284 | const int medium_star_speed = 5; |
| Noximilien | 13:5c3dc6e827c2 | 285 | for (int i = 0; i < MAX_MEDIUM_STARS; ++i) { |
| Noximilien | 13:5c3dc6e827c2 | 286 | if (medium_stars[i].active) { |
| Noximilien | 13:5c3dc6e827c2 | 287 | medium_stars[i].x -= medium_star_speed; |
| Noximilien | 13:5c3dc6e827c2 | 288 | if (medium_stars[i].x <= -2){ |
| Noximilien | 13:5c3dc6e827c2 | 289 | medium_stars[i].active = false; |
| Noximilien | 13:5c3dc6e827c2 | 290 | } |
| Noximilien | 13:5c3dc6e827c2 | 291 | lcd.drawSprite(medium_stars[i].x, medium_stars[i].y, 5, 5, (int*)starMedium); |
| Noximilien | 13:5c3dc6e827c2 | 292 | } |
| Noximilien | 13:5c3dc6e827c2 | 293 | } |
| Noximilien | 13:5c3dc6e827c2 | 294 | } |
| Noximilien | 13:5c3dc6e827c2 | 295 | |
| Noximilien | 18:6becc9f9de5e | 296 | void shipMovment(){ // The position of the player |
| Noximilien | 13:5c3dc6e827c2 | 297 | |
| Noximilien | 15:0145c5f0bea1 | 298 | if(x_ship_pos <= screen_height && x_ship_pos >= 0){ |
| Noximilien | 13:5c3dc6e827c2 | 299 | if(x_dir.read() > 0.6f){ |
| Noximilien | 13:5c3dc6e827c2 | 300 | x_ship_pos -= ship_speed; |
| Noximilien | 13:5c3dc6e827c2 | 301 | } |
| Noximilien | 13:5c3dc6e827c2 | 302 | else if(x_dir.read() < 0.4f){ |
| Noximilien | 13:5c3dc6e827c2 | 303 | x_ship_pos += ship_speed; |
| Noximilien | 13:5c3dc6e827c2 | 304 | } |
| Noximilien | 13:5c3dc6e827c2 | 305 | } |
| Noximilien | 13:5c3dc6e827c2 | 306 | |
| Noximilien | 13:5c3dc6e827c2 | 307 | else if (x_ship_pos <= 48){ x_ship_pos = 0;} //Limits for x direction border IMPROVE IF POSSIBLE. |
| Noximilien | 13:5c3dc6e827c2 | 308 | else { x_ship_pos = 48;} |
| Noximilien | 13:5c3dc6e827c2 | 309 | |
| Noximilien | 13:5c3dc6e827c2 | 310 | |
| Noximilien | 15:0145c5f0bea1 | 311 | if (y_ship_pos <= (screen_height - spaceship1_height) && y_ship_pos >= game_score_height){ |
| Noximilien | 13:5c3dc6e827c2 | 312 | if(y_dir.read() > 0.6f){ |
| Noximilien | 13:5c3dc6e827c2 | 313 | y_ship_pos -= ship_speed; |
| Noximilien | 13:5c3dc6e827c2 | 314 | } |
| Noximilien | 13:5c3dc6e827c2 | 315 | else if(y_dir.read() < 0.4f){ |
| Noximilien | 13:5c3dc6e827c2 | 316 | y_ship_pos += ship_speed; |
| Noximilien | 13:5c3dc6e827c2 | 317 | } |
| Noximilien | 13:5c3dc6e827c2 | 318 | } |
| Noximilien | 15:0145c5f0bea1 | 319 | else if (y_ship_pos >= (screen_height - spaceship1_height)){ //Limits for y direction border IMPROVE IF POSSIBLE. |
| Noximilien | 15:0145c5f0bea1 | 320 | y_ship_pos = screen_height - spaceship1_height; |
| Noximilien | 14:e8de27c4d0d4 | 321 | } |
| Noximilien | 15:0145c5f0bea1 | 322 | else if (y_ship_pos < game_score_height){ |
| Noximilien | 15:0145c5f0bea1 | 323 | y_ship_pos = game_score_height; |
| Noximilien | 14:e8de27c4d0d4 | 324 | } |
| Noximilien | 13:5c3dc6e827c2 | 325 | } |
| Noximilien | 13:5c3dc6e827c2 | 326 | |
| Noximilien | 14:e8de27c4d0d4 | 327 | void highScore(){ |
| Noximilien | 16:b7d0cac561cc | 328 | |
| Noximilien | 14:e8de27c4d0d4 | 329 | char buffer[4]; |
| Noximilien | 14:e8de27c4d0d4 | 330 | sprintf(buffer," Score: %i",game_score); |
| Noximilien | 14:e8de27c4d0d4 | 331 | lcd.printString(buffer,0,0); |
| Noximilien | 14:e8de27c4d0d4 | 332 | } |
| Noximilien | 13:5c3dc6e827c2 | 333 | |
| Noximilien | 16:b7d0cac561cc | 334 | void playerLivesRemain(){//////////////////////////////////////////////////////////////////////////////// |
| Noximilien | 17:69a85c909566 | 335 | if (player_lifes == 3){ |
| Noximilien | 18:6becc9f9de5e | 336 | //turn all LEDs on |
| Noximilien | 18:6becc9f9de5e | 337 | gamepad.leds_on(); |
| Noximilien | 16:b7d0cac561cc | 338 | } |
| Noximilien | 18:6becc9f9de5e | 339 | else if (player_lifes == 2){ |
| Noximilien | 16:b7d0cac561cc | 340 | // only yelow and red are lit (to tal 4) |
| Noximilien | 18:6becc9f9de5e | 341 | |
| Noximilien | 18:6becc9f9de5e | 342 | //gamepad.leds_on(); |
| Noximilien | 18:6becc9f9de5e | 343 | gamepad.led(6,0.0); |
| Noximilien | 18:6becc9f9de5e | 344 | gamepad.led(3,0.0); |
| Noximilien | 16:b7d0cac561cc | 345 | } |
| Noximilien | 18:6becc9f9de5e | 346 | else if (player_lifes == 1){ |
| Noximilien | 16:b7d0cac561cc | 347 | // red LED is lit and flashes. |
| Noximilien | 18:6becc9f9de5e | 348 | gamepad.led(2,0.0); |
| Noximilien | 18:6becc9f9de5e | 349 | gamepad.led(5,0.0); |
| Noximilien | 19:b78fa41d04a9 | 350 | if (red_led_flashing == 5){ |
| Noximilien | 19:b78fa41d04a9 | 351 | gamepad.led(1,(float)red_led_state); |
| Noximilien | 19:b78fa41d04a9 | 352 | gamepad.led(4,(float)red_led_state); |
| Noximilien | 19:b78fa41d04a9 | 353 | gamepad.led(1,(float)!red_led_state); |
| Noximilien | 19:b78fa41d04a9 | 354 | gamepad.led(4,(float)!red_led_state); |
| Noximilien | 19:b78fa41d04a9 | 355 | red_led_flashing = 0; |
| Noximilien | 19:b78fa41d04a9 | 356 | red_led_state = !red_led_state; |
| Noximilien | 19:b78fa41d04a9 | 357 | } |
| Noximilien | 17:69a85c909566 | 358 | |
| Noximilien | 19:b78fa41d04a9 | 359 | red_led_flashing += 1; |
| Noximilien | 16:b7d0cac561cc | 360 | } |
| Noximilien | 16:b7d0cac561cc | 361 | else { |
| Noximilien | 16:b7d0cac561cc | 362 | // all LEDs are flashing |
| Noximilien | 18:6becc9f9de5e | 363 | gamepad.leds_off(); |
| Noximilien | 16:b7d0cac561cc | 364 | game_over = true; |
| Noximilien | 16:b7d0cac561cc | 365 | } |
| Noximilien | 16:b7d0cac561cc | 366 | |
| Noximilien | 16:b7d0cac561cc | 367 | } |
| Noximilien | 16:b7d0cac561cc | 368 | |
| Noximilien | 19:b78fa41d04a9 | 369 | bool Game::checkGameOver() { |
| Noximilien | 19:b78fa41d04a9 | 370 | bool game_is_over = true; |
| Noximilien | 19:b78fa41d04a9 | 371 | bool game_is_not_over = false; |
| Noximilien | 19:b78fa41d04a9 | 372 | if (game_over){ |
| Noximilien | 19:b78fa41d04a9 | 373 | game_over = false; |
| Noximilien | 19:b78fa41d04a9 | 374 | player_lifes = 3; |
| Noximilien | 19:b78fa41d04a9 | 375 | return game_is_over; |
| Noximilien | 19:b78fa41d04a9 | 376 | } |
| Noximilien | 19:b78fa41d04a9 | 377 | else { return game_is_not_over;} |
| Noximilien | 19:b78fa41d04a9 | 378 | } |
| Noximilien | 19:b78fa41d04a9 | 379 | |
| Noximilien | 4:02c63aaa2df9 | 380 | bool Game::updateAndDraw() { |
| Noximilien | 6:100b46be4bea | 381 | |
| Noximilien | 6:100b46be4bea | 382 | shipMovment(); |
| Noximilien | 19:b78fa41d04a9 | 383 | if (gamepad.check_event(gamepad.X_PRESSED)){ |
| Noximilien | 9:5ad5501c702e | 384 | fireNewBlast(); |
| Noximilien | 6:100b46be4bea | 385 | } |
| Noximilien | 11:cf2ba52e8b7e | 386 | if (small_star_delay == small_star_delay_max){ |
| Noximilien | 11:cf2ba52e8b7e | 387 | //This is dealy between small stars generation. |
| Noximilien | 18:6becc9f9de5e | 388 | //newSmallStarFlies(); |
| Noximilien | 18:6becc9f9de5e | 389 | //newMediumStarFlies(); |
| Noximilien | 12:bfe3a3deaac3 | 390 | spawnNewEnemy(); |
| Noximilien | 12:bfe3a3deaac3 | 391 | |
| Noximilien | 11:cf2ba52e8b7e | 392 | small_star_delay = 0; |
| Noximilien | 10:f02413ae09fe | 393 | } |
| Noximilien | 10:f02413ae09fe | 394 | else { |
| Noximilien | 11:cf2ba52e8b7e | 395 | small_star_delay += 1; |
| Noximilien | 10:f02413ae09fe | 396 | } |
| Noximilien | 7:42376925945c | 397 | |
| Noximilien | 16:b7d0cac561cc | 398 | if (enemy_blast_delay == enemy_blast_delay_max){ |
| Noximilien | 16:b7d0cac561cc | 399 | |
| Noximilien | 16:b7d0cac561cc | 400 | fireNewEnemyBlast(); |
| Noximilien | 16:b7d0cac561cc | 401 | enemy_blast_delay = 0; |
| Noximilien | 16:b7d0cac561cc | 402 | } |
| Noximilien | 16:b7d0cac561cc | 403 | else { |
| Noximilien | 16:b7d0cac561cc | 404 | enemy_blast_delay += 1; |
| Noximilien | 16:b7d0cac561cc | 405 | } |
| Noximilien | 16:b7d0cac561cc | 406 | |
| Noximilien | 17:69a85c909566 | 407 | playerLivesRemain(); |
| Noximilien | 9:5ad5501c702e | 408 | updateAndDrawBlasts(); |
| Noximilien | 11:cf2ba52e8b7e | 409 | updateAndDrawSmallStars(); |
| Noximilien | 11:cf2ba52e8b7e | 410 | updateAndDrawMediumStars(); |
| Noximilien | 12:bfe3a3deaac3 | 411 | updateAndDrawEnemies(); |
| Noximilien | 12:bfe3a3deaac3 | 412 | collideEnemiesAndBlasts(); |
| Noximilien | 18:6becc9f9de5e | 413 | collideEnemiesBlastsAndPlayer(); |
| Noximilien | 16:b7d0cac561cc | 414 | updateAndDrawEnemyBlasts(); |
| Noximilien | 14:e8de27c4d0d4 | 415 | highScore(); |
| Noximilien | 5:2b9181bc5c89 | 416 | |
| Noximilien | 9:5ad5501c702e | 417 | lcd.drawSpriteOnTop(x_ship_pos, y_ship_pos, spaceship1_width, spaceship1_height, (int *)spaceShip1); |
| Noximilien | 5:2b9181bc5c89 | 418 | /*char buffer[4]; |
| Noximilien | 5:2b9181bc5c89 | 419 | sprintf(buffer,"%i\n",(int)(x_dir.read()*84)); |
| Noximilien | 5:2b9181bc5c89 | 420 | printf(buffer);*/ |
| Noximilien | 3:10918b0f7a7d | 421 | |
| Noximilien | 4:02c63aaa2df9 | 422 | bool want_to_pause = false; |
| Noximilien | 4:02c63aaa2df9 | 423 | if (gamepad.check_event(gamepad.START_PRESSED)){ |
| Noximilien | 19:b78fa41d04a9 | 424 | want_to_pause = true; |
| Noximilien | 7:42376925945c | 425 | |
| Noximilien | 4:02c63aaa2df9 | 426 | } |
| Noximilien | 4:02c63aaa2df9 | 427 | return want_to_pause; |
| Noximilien | 19:b78fa41d04a9 | 428 | } |
| Noximilien | 19:b78fa41d04a9 | 429 |
