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@22:4dc3c95f2146, 2019-03-27 (annotated)
- Committer:
 - Noximilien
 - Date:
 - Wed Mar 27 16:35:52 2019 +0000
 - Revision:
 - 22:4dc3c95f2146
 - Parent:
 - 21:0eb394495b8a
 - Child:
 - 23:240bc00ef25b
 
I have started creating Doxygen comments for the report.
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 | 21:0eb394495b8a | 10 | #include "geometry.h" | 
| Noximilien | 21:0eb394495b8a | 11 | #include "gameobject.h" | 
| Noximilien | 21:0eb394495b8a | 12 | |
| Noximilien | 21:0eb394495b8a | 13 | #include "enemies.h" | 
| Noximilien | 22:4dc3c95f2146 | 14 | #include "constants.h" | 
| Noximilien | 20:557e84189a57 | 15 | |
| Noximilien | 21:0eb394495b8a | 16 | bool game_over = true; | 
| Noximilien | 21:0eb394495b8a | 17 | int small_star_delay; | 
| Noximilien | 21:0eb394495b8a | 18 | int game_score; | 
| Noximilien | 21:0eb394495b8a | 19 | int player_lifes; | 
| Noximilien | 21:0eb394495b8a | 20 | bool red_led_state; | 
| Noximilien | 21:0eb394495b8a | 21 | int red_led_flashing; | 
| Noximilien | 7:42376925945c | 22 | |
| Noximilien | 8:c18c240665aa | 23 | const int ship_speed = 2; | 
| Noximilien | 11:cf2ba52e8b7e | 24 | const int small_star_delay_max = 3; | 
| Noximilien | 6:100b46be4bea | 25 | |
| Noximilien | 21:0eb394495b8a | 26 | Game::Game() { | 
| Noximilien | 21:0eb394495b8a | 27 | player_bounds.center.x = 5; | 
| Noximilien | 21:0eb394495b8a | 28 | player_bounds.center.y = 7; | 
| Noximilien | 21:0eb394495b8a | 29 | player_bounds.radius = 8; | 
| Noximilien | 19:b78fa41d04a9 | 30 | |
| Noximilien | 21:0eb394495b8a | 31 | blast_bounds.center.x = 0; | 
| Noximilien | 21:0eb394495b8a | 32 | blast_bounds.center.y = 1; | 
| Noximilien | 21:0eb394495b8a | 33 | blast_bounds.radius = 1; | 
| Noximilien | 21:0eb394495b8a | 34 | } | 
| Noximilien | 20:557e84189a57 | 35 | |
| Noximilien | 12:bfe3a3deaac3 | 36 | #define MAX_BLASTS (5) | 
| Noximilien | 12:bfe3a3deaac3 | 37 | GameObject blasts[MAX_BLASTS]; | 
| Noximilien | 12:bfe3a3deaac3 | 38 | |
| Noximilien | 12:bfe3a3deaac3 | 39 | #define MAX_SMALL_STARS (5) | 
| Noximilien | 21:0eb394495b8a | 40 | #define MAX_MEDIUM_STARS (10) | 
| Noximilien | 13:5c3dc6e827c2 | 41 | GameObject small_stars[MAX_SMALL_STARS]; | 
| Noximilien | 13:5c3dc6e827c2 | 42 | GameObject medium_stars[MAX_MEDIUM_STARS]; | 
| Noximilien | 21:0eb394495b8a | 43 | #include "stars.h" | 
| Noximilien | 11:cf2ba52e8b7e | 44 | |
| Noximilien | 21:0eb394495b8a | 45 | Enemies enemies; | 
| Noximilien | 12:bfe3a3deaac3 | 46 | GameObject player; | 
| Noximilien | 12:bfe3a3deaac3 | 47 | |
| Noximilien | 21:0eb394495b8a | 48 | #include "hud.h" | 
| Noximilien | 12:bfe3a3deaac3 | 49 | |
| Noximilien | 22:4dc3c95f2146 | 50 | /**@brief | 
| Noximilien | 21:0eb394495b8a | 51 | * Will move every active blast to the left with blast speed. | 
| Noximilien | 21:0eb394495b8a | 52 | * Will deactivate blasts when they live screen, for future reuse | 
| Noximilien | 21:0eb394495b8a | 53 | */ | 
| Noximilien | 21:0eb394495b8a | 54 | void Game::updateAndDrawBlasts() { | 
| Noximilien | 21:0eb394495b8a | 55 | const int blast_speed = 5; | 
| Noximilien | 21:0eb394495b8a | 56 | for (int i = 0; i < MAX_BLASTS; ++i) { | 
| Noximilien | 21:0eb394495b8a | 57 | if (blasts[i].active) { | 
| Noximilien | 21:0eb394495b8a | 58 | blasts[i].pos.x += blast_speed; | 
| Noximilien | 21:0eb394495b8a | 59 | if (blasts[i].pos.x >= screen_width){ | 
| Noximilien | 21:0eb394495b8a | 60 | blasts[i].active = false; | 
| Noximilien | 14:e8de27c4d0d4 | 61 | } | 
| Noximilien | 21:0eb394495b8a | 62 | lcd.setPixel(blasts[i].pos.x, blasts[i].pos.y, 1); | 
| Noximilien | 21:0eb394495b8a | 63 | lcd.setPixel(blasts[i].pos.x+1, blasts[i].pos.y, 1); | 
| Noximilien | 21:0eb394495b8a | 64 | lcd.setPixel(blasts[i].pos.x+2, blasts[i].pos.y, 1); | 
| Noximilien | 12:bfe3a3deaac3 | 65 | } | 
| Noximilien | 12:bfe3a3deaac3 | 66 | } | 
| Noximilien | 12:bfe3a3deaac3 | 67 | } | 
| Noximilien | 12:bfe3a3deaac3 | 68 | |
| Noximilien | 22:4dc3c95f2146 | 69 | /**@brief | 
| Noximilien | 22:4dc3c95f2146 | 70 | * This function searches the array for the inactive blasts, | 
| Noximilien | 22:4dc3c95f2146 | 71 | * If a blast is set to not active, it will set it active and start drawing | 
| Noximilien | 22:4dc3c95f2146 | 72 | * it accross the screen until it reaches the LCD border line. | 
| Noximilien | 22:4dc3c95f2146 | 73 | */ | 
| Noximilien | 21:0eb394495b8a | 74 | void Game::fireNewBlast() { | 
| Noximilien | 12:bfe3a3deaac3 | 75 | // Search the array of blasts if inactive we can use it. | 
| Noximilien | 12:bfe3a3deaac3 | 76 | int found = -1; | 
| Noximilien | 12:bfe3a3deaac3 | 77 | for (int i = 0; i < MAX_BLASTS; ++i) { | 
| Noximilien | 12:bfe3a3deaac3 | 78 | if (!blasts[i].active) { | 
| Noximilien | 12:bfe3a3deaac3 | 79 | found = i; | 
| Noximilien | 12:bfe3a3deaac3 | 80 | break; | 
| Noximilien | 12:bfe3a3deaac3 | 81 | } | 
| Noximilien | 12:bfe3a3deaac3 | 82 | } | 
| Noximilien | 12:bfe3a3deaac3 | 83 | |
| Noximilien | 12:bfe3a3deaac3 | 84 | if (found != -1) { | 
| Noximilien | 12:bfe3a3deaac3 | 85 | blasts[found].active = true; | 
| Noximilien | 21:0eb394495b8a | 86 | blasts[found].pos.x = player.pos.x + spaceship1_width; | 
| Noximilien | 21:0eb394495b8a | 87 | blasts[found].pos.y = player.pos.y + (spaceship1_height/2); | 
| Noximilien | 12:bfe3a3deaac3 | 88 | } | 
| Noximilien | 12:bfe3a3deaac3 | 89 | } | 
| Noximilien | 22:4dc3c95f2146 | 90 | /**@brief | 
| Noximilien | 22:4dc3c95f2146 | 91 | * This function checks whether the requirments for the collision of the two objects, | 
| Noximilien | 22:4dc3c95f2146 | 92 | * are met. When those requirments are met the collision of two objects function will | 
| Noximilien | 22:4dc3c95f2146 | 93 | * be checking wheter the boundaries of the objects colide. If they do, the blast | 
| Noximilien | 22:4dc3c95f2146 | 94 | * becomes inactive, in game score increases and enemy dies. | 
| Noximilien | 22:4dc3c95f2146 | 95 | */ | 
| Noximilien | 21:0eb394495b8a | 96 | void Game::collideEnemiesAndBlasts() { | 
| Noximilien | 21:0eb394495b8a | 97 | for (int i = 0; i < max_enemies; ++i) { | 
| Noximilien | 12:bfe3a3deaac3 | 98 | for (int j = 0; j < MAX_BLASTS; ++j) { | 
| Noximilien | 21:0eb394495b8a | 99 | Enemy& enemy = enemies.enemies[i]; | 
| Noximilien | 21:0eb394495b8a | 100 | GameObject& blast = blasts[j]; | 
| Noximilien | 21:0eb394495b8a | 101 | if (enemy.active && !enemy.dead && blast.active) { | 
| Noximilien | 12:bfe3a3deaac3 | 102 | bool collision = circleCollideTwoObjects( | 
| Noximilien | 21:0eb394495b8a | 103 | enemy.pos, enemies.enemy_bounds, | 
| Noximilien | 21:0eb394495b8a | 104 | blast.pos, blast_bounds | 
| Noximilien | 12:bfe3a3deaac3 | 105 | ); | 
| Noximilien | 12:bfe3a3deaac3 | 106 | if (collision) { | 
| Noximilien | 21:0eb394495b8a | 107 | enemy.die(); | 
| Noximilien | 21:0eb394495b8a | 108 | game_score += 30; | 
| Noximilien | 21:0eb394495b8a | 109 | blast.active = false; | 
| Noximilien | 12:bfe3a3deaac3 | 110 | } | 
| Noximilien | 12:bfe3a3deaac3 | 111 | } | 
| Noximilien | 12:bfe3a3deaac3 | 112 | } | 
| Noximilien | 12:bfe3a3deaac3 | 113 | } | 
| Noximilien | 12:bfe3a3deaac3 | 114 | } | 
| Noximilien | 5:2b9181bc5c89 | 115 | |
| Noximilien | 22:4dc3c95f2146 | 116 | /**@brief | 
| Noximilien | 22:4dc3c95f2146 | 117 | * This code does the same work as the one before but with two other object. | 
| Noximilien | 22:4dc3c95f2146 | 118 | * It checks whether the requirments for the collision of the two objects, | 
| Noximilien | 22:4dc3c95f2146 | 119 | * are met. When those requirments are met the collision of two objects function will | 
| Noximilien | 22:4dc3c95f2146 | 120 | * be checking wheter the boundaries of the objects colide. If they do, the blast | 
| Noximilien | 22:4dc3c95f2146 | 121 | * becomes inactive, in game score increases and enemy dies. | 
| Noximilien | 22:4dc3c95f2146 | 122 | */ | 
| Noximilien | 21:0eb394495b8a | 123 | void Game::collideEnemiesBlastsAndPlayer() { | 
| Noximilien | 21:0eb394495b8a | 124 | for (int i = 0; i < max_enemy_blasts; ++i) { | 
| Noximilien | 21:0eb394495b8a | 125 | GameObject& blast = enemies.enemy_blasts[i]; | 
| Noximilien | 21:0eb394495b8a | 126 | if (blast.active) { | 
| Noximilien | 21:0eb394495b8a | 127 | bool collision = circleCollideTwoObjects( | 
| Noximilien | 21:0eb394495b8a | 128 | player.pos, player_bounds, | 
| Noximilien | 21:0eb394495b8a | 129 | blast.pos, enemies.enemy_blast_bounds | 
| Noximilien | 21:0eb394495b8a | 130 | ); | 
| Noximilien | 21:0eb394495b8a | 131 | if (collision) { | 
| Noximilien | 21:0eb394495b8a | 132 | player_lifes -= 1; | 
| Noximilien | 21:0eb394495b8a | 133 | blast.active = false; | 
| Noximilien | 18:6becc9f9de5e | 134 | } | 
| Noximilien | 18:6becc9f9de5e | 135 | } | 
| Noximilien | 18:6becc9f9de5e | 136 | } | 
| Noximilien | 18:6becc9f9de5e | 137 | } | 
| Noximilien | 22:4dc3c95f2146 | 138 | /**@brief | 
| Noximilien | 22:4dc3c95f2146 | 139 | * The function reads the analog input signal from joystick and moves the | 
| Noximilien | 22:4dc3c95f2146 | 140 | * player's ship on the LCD accordingly.(move joystic, the ship moves up | 
| Noximilien | 22:4dc3c95f2146 | 141 | * move joystick right, the ship moves right). Also, It prevents the player's | 
| Noximilien | 22:4dc3c95f2146 | 142 | * ship to go beyond the playing zone limits. | 
| Noximilien | 22:4dc3c95f2146 | 143 | */ | 
| Noximilien | 22:4dc3c95f2146 | 144 | void Game::playerShipMovement(){ | 
| Noximilien | 22:4dc3c95f2146 | 145 | if(x_dir.read() > joy_threshold_max_x){ | 
| Noximilien | 21:0eb394495b8a | 146 | player.pos.x -= ship_speed; | 
| Noximilien | 21:0eb394495b8a | 147 | } | 
| Noximilien | 22:4dc3c95f2146 | 148 | else if(x_dir.read() < joy_threshold_min_x){ | 
| Noximilien | 21:0eb394495b8a | 149 | player.pos.x += ship_speed; | 
| Noximilien | 21:0eb394495b8a | 150 | } | 
| Noximilien | 22:4dc3c95f2146 | 151 | if(y_dir.read() > joy_threshold_max_y){ | 
| Noximilien | 21:0eb394495b8a | 152 | player.pos.y -= ship_speed; | 
| Noximilien | 13:5c3dc6e827c2 | 153 | } | 
| Noximilien | 22:4dc3c95f2146 | 154 | else if(y_dir.read() < joy_threshold_min_y){ | 
| Noximilien | 21:0eb394495b8a | 155 | player.pos.y += ship_speed; | 
| Noximilien | 13:5c3dc6e827c2 | 156 | } | 
| Noximilien | 21:0eb394495b8a | 157 | //Limits player ship on screen | 
| Noximilien | 21:0eb394495b8a | 158 | if (player.pos.x < game_area_x){ player.pos.x = game_area_x;} | 
| Noximilien | 21:0eb394495b8a | 159 | if (player.pos.y < game_area_y) { player.pos.y = game_area_y;} | 
| Noximilien | 21:0eb394495b8a | 160 | int max_player_x = game_area_x + game_area_width - spaceship1_width; | 
| Noximilien | 21:0eb394495b8a | 161 | int max_player_y = game_area_y + game_area_height - spaceship1_height; | 
| Noximilien | 21:0eb394495b8a | 162 | if (player.pos.x > max_player_x) player.pos.x = max_player_x; | 
| Noximilien | 21:0eb394495b8a | 163 | if (player.pos.y > max_player_y) player.pos.y = max_player_y; | 
| Noximilien | 13:5c3dc6e827c2 | 164 | } | 
| Noximilien | 13:5c3dc6e827c2 | 165 | |
| Noximilien | 22:4dc3c95f2146 | 166 | /**@brief | 
| Noximilien | 22:4dc3c95f2146 | 167 | * This function resets all values to their intial values when the game is | 
| Noximilien | 22:4dc3c95f2146 | 168 | * first starts and when the player dies and wants to restart the game. | 
| Noximilien | 22:4dc3c95f2146 | 169 | * It does not reset the values when the game is paused. | 
| Noximilien | 22:4dc3c95f2146 | 170 | */ | 
| Noximilien | 21:0eb394495b8a | 171 | void Game::startNewGame() { | 
| Noximilien | 21:0eb394495b8a | 172 | game_over = false; | 
| Noximilien | 21:0eb394495b8a | 173 | player.pos.x = 0; | 
| Noximilien | 21:0eb394495b8a | 174 | player.pos.y = 24; | 
| Noximilien | 21:0eb394495b8a | 175 | small_star_delay = 0; | 
| Noximilien | 21:0eb394495b8a | 176 | game_score = 0; | 
| Noximilien | 21:0eb394495b8a | 177 | player_lifes = 3; | 
| Noximilien | 21:0eb394495b8a | 178 | red_led_state = false; | 
| Noximilien | 21:0eb394495b8a | 179 | red_led_flashing = 0; | 
| Noximilien | 21:0eb394495b8a | 180 | for (int i = 0; i < max_enemies; ++i) { | 
| Noximilien | 21:0eb394495b8a | 181 | enemies.enemies[i].active = false; | 
| Noximilien | 13:5c3dc6e827c2 | 182 | } | 
| Noximilien | 21:0eb394495b8a | 183 | for (int i = 0; i < MAX_BLASTS; ++i) { | 
| Noximilien | 21:0eb394495b8a | 184 | blasts[i].active = false; | 
| Noximilien | 13:5c3dc6e827c2 | 185 | } | 
| Noximilien | 21:0eb394495b8a | 186 | for (int i = 0; i < max_enemy_blasts; ++i) { | 
| Noximilien | 21:0eb394495b8a | 187 | enemies.enemy_blasts[i].active = false; | 
| Noximilien | 13:5c3dc6e827c2 | 188 | } | 
| Noximilien | 13:5c3dc6e827c2 | 189 | } | 
| Noximilien | 13:5c3dc6e827c2 | 190 | |
| Noximilien | 21:0eb394495b8a | 191 | bool Game::updateAndDraw() { | 
| Noximilien | 21:0eb394495b8a | 192 | if (game_over) { | 
| Noximilien | 21:0eb394495b8a | 193 | startNewGame(); | 
| Noximilien | 13:5c3dc6e827c2 | 194 | } | 
| Noximilien | 22:4dc3c95f2146 | 195 | playerShipMovement(); | 
| Noximilien | 19:b78fa41d04a9 | 196 | if (gamepad.check_event(gamepad.X_PRESSED)){ | 
| Noximilien | 9:5ad5501c702e | 197 | fireNewBlast(); | 
| Noximilien | 6:100b46be4bea | 198 | } | 
| Noximilien | 11:cf2ba52e8b7e | 199 | if (small_star_delay == small_star_delay_max){ | 
| Noximilien | 11:cf2ba52e8b7e | 200 | //This is dealy between small stars generation. | 
| Noximilien | 21:0eb394495b8a | 201 | enemies.spawnNewEnemy(); | 
| Noximilien | 12:bfe3a3deaac3 | 202 | |
| Noximilien | 11:cf2ba52e8b7e | 203 | small_star_delay = 0; | 
| Noximilien | 10:f02413ae09fe | 204 | } | 
| Noximilien | 10:f02413ae09fe | 205 | else { | 
| Noximilien | 11:cf2ba52e8b7e | 206 | small_star_delay += 1; | 
| Noximilien | 10:f02413ae09fe | 207 | } | 
| Noximilien | 7:42376925945c | 208 | |
| Noximilien | 21:0eb394495b8a | 209 | displayLifes(); | 
| Noximilien | 9:5ad5501c702e | 210 | updateAndDrawBlasts(); | 
| Noximilien | 11:cf2ba52e8b7e | 211 | updateAndDrawSmallStars(); | 
| Noximilien | 11:cf2ba52e8b7e | 212 | updateAndDrawMediumStars(); | 
| Noximilien | 21:0eb394495b8a | 213 | enemies.updateAndDrawEnemies(); | 
| Noximilien | 12:bfe3a3deaac3 | 214 | collideEnemiesAndBlasts(); | 
| Noximilien | 18:6becc9f9de5e | 215 | collideEnemiesBlastsAndPlayer(); | 
| Noximilien | 21:0eb394495b8a | 216 | enemies.updateAndDrawEnemyBlasts(); | 
| Noximilien | 21:0eb394495b8a | 217 | drawHighScore(); | 
| Noximilien | 5:2b9181bc5c89 | 218 | |
| Noximilien | 21:0eb394495b8a | 219 | lcd.drawSpriteOnTop(player.pos.x, player.pos.y, spaceship1_width, spaceship1_height, (int *)spaceShip1); | 
| Noximilien | 3:10918b0f7a7d | 220 | |
| Noximilien | 4:02c63aaa2df9 | 221 | bool want_to_pause = false; | 
| Noximilien | 21:0eb394495b8a | 222 | if (game_over){ | 
| Noximilien | 21:0eb394495b8a | 223 | lcd.clear(); | 
| Noximilien | 21:0eb394495b8a | 224 | lcd.printString("GameOver",0,1); | 
| Noximilien | 21:0eb394495b8a | 225 | lcd.refresh(); | 
| Noximilien | 21:0eb394495b8a | 226 | wait(1); | 
| Noximilien | 21:0eb394495b8a | 227 | lcd.printString("Press Y",0,4); | 
| Noximilien | 21:0eb394495b8a | 228 | lcd.printString("to restart",0,5); | 
| Noximilien | 21:0eb394495b8a | 229 | lcd.refresh(); | 
| Noximilien | 21:0eb394495b8a | 230 | bool led_state = false; | 
| Noximilien | 21:0eb394495b8a | 231 | while (!gamepad.check_event(gamepad.Y_PRESSED)){////////////////////////////// | 
| Noximilien | 21:0eb394495b8a | 232 | gamepad.led(1,(float)led_state); | 
| Noximilien | 21:0eb394495b8a | 233 | gamepad.led(2,(float)!led_state); | 
| Noximilien | 21:0eb394495b8a | 234 | gamepad.led(3,(float)led_state); | 
| Noximilien | 21:0eb394495b8a | 235 | gamepad.led(4,(float)!led_state); | 
| Noximilien | 21:0eb394495b8a | 236 | gamepad.led(5,(float)led_state); | 
| Noximilien | 21:0eb394495b8a | 237 | gamepad.led(6,(float)!led_state); | 
| Noximilien | 21:0eb394495b8a | 238 | wait(0.5); | 
| Noximilien | 21:0eb394495b8a | 239 | led_state = !led_state; | 
| Noximilien | 21:0eb394495b8a | 240 | } | 
| Noximilien | 21:0eb394495b8a | 241 | want_to_pause = true; | 
| Noximilien | 21:0eb394495b8a | 242 | } | 
| Noximilien | 21:0eb394495b8a | 243 | |
| Noximilien | 21:0eb394495b8a | 244 | |
| Noximilien | 4:02c63aaa2df9 | 245 | if (gamepad.check_event(gamepad.START_PRESSED)){ | 
| Noximilien | 19:b78fa41d04a9 | 246 | want_to_pause = true; | 
| Noximilien | 7:42376925945c | 247 | |
| Noximilien | 4:02c63aaa2df9 | 248 | } | 
| Noximilien | 4:02c63aaa2df9 | 249 | return want_to_pause; | 
| Noximilien | 19:b78fa41d04a9 | 250 | } | 
| Noximilien | 19:b78fa41d04a9 | 251 | 
