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