Initial publish
Dependencies: mbed
Fork of el17dg by
game/game.cpp@40:e3bbda7444fa, 2019-05-07 (annotated)
- Committer:
- Noximilien
- Date:
- Tue May 07 15:22:35 2019 +0000
- Revision:
- 40:e3bbda7444fa
- Parent:
- 39:ca77a6d574e6
The Final, Submission Version. I have read and agreed to the academic integrity. SID:201160286
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Noximilien | 3:10918b0f7a7d | 1 | #include "mbed.h" |
Noximilien | 3:10918b0f7a7d | 2 | #include "N5110.h" |
Noximilien | 3:10918b0f7a7d | 3 | #include "Gamepad.h" |
Noximilien | 33:c623c6d5ed16 | 4 | #include "collision_lib.h" |
Noximilien | 3:10918b0f7a7d | 5 | |
Noximilien | 3:10918b0f7a7d | 6 | #include "models.h" |
Noximilien | 4:02c63aaa2df9 | 7 | #include "main.h" |
Noximilien | 4:02c63aaa2df9 | 8 | #include "game.h" |
Noximilien | 21:0eb394495b8a | 9 | #include "gameobject.h" |
Noximilien | 21:0eb394495b8a | 10 | |
Noximilien | 33:c623c6d5ed16 | 11 | #include "boss.h" |
Noximilien | 21:0eb394495b8a | 12 | #include "enemies.h" |
Noximilien | 22:4dc3c95f2146 | 13 | #include "constants.h" |
Noximilien | 23:240bc00ef25b | 14 | #include "stars.h" |
Noximilien | 23:240bc00ef25b | 15 | #include "player.h" |
Noximilien | 26:676874c42883 | 16 | #include "hud.h" |
Noximilien | 33:c623c6d5ed16 | 17 | #include "gameovermanager.h" |
Noximilien | 33:c623c6d5ed16 | 18 | |
Noximilien | 20:557e84189a57 | 19 | |
Noximilien | 34:754915ce9de5 | 20 | const int increase_difficulty = 70; |
Noximilien | 31:becb8f6bf7b7 | 21 | int GameGlobals::game_score = 0; |
Noximilien | 31:becb8f6bf7b7 | 22 | int GameGlobals::score_count_for_difficulty = 0; |
Noximilien | 31:becb8f6bf7b7 | 23 | int GameGlobals::player_lifes = 3; |
Noximilien | 31:becb8f6bf7b7 | 24 | int GameGlobals::high_score = 0; |
Noximilien | 31:becb8f6bf7b7 | 25 | bool GameGlobals::is_shield_on = false; |
Noximilien | 34:754915ce9de5 | 26 | int GameGlobals::score_count_for_boss_mode = 0; |
Noximilien | 11:cf2ba52e8b7e | 27 | |
Noximilien | 33:c623c6d5ed16 | 28 | Boss boss; |
Noximilien | 21:0eb394495b8a | 29 | Enemies enemies; |
Noximilien | 34:754915ce9de5 | 30 | Enemy enemy; |
Noximilien | 23:240bc00ef25b | 31 | Stars stars; |
Noximilien | 33:c623c6d5ed16 | 32 | Player player; |
Noximilien | 33:c623c6d5ed16 | 33 | GameOverManager gameOverManager; |
Noximilien | 33:c623c6d5ed16 | 34 | |
Noximilien | 26:676874c42883 | 35 | Hud hud; |
Noximilien | 12:bfe3a3deaac3 | 36 | |
Noximilien | 33:c623c6d5ed16 | 37 | |
Noximilien | 33:c623c6d5ed16 | 38 | void Game::updateAndDrawGameplay() { |
Noximilien | 33:c623c6d5ed16 | 39 | checkButtonToShoot(); |
Noximilien | 33:c623c6d5ed16 | 40 | player.updateAndDraw(); |
Noximilien | 33:c623c6d5ed16 | 41 | player.updateAndDrawBlasts(); |
Noximilien | 33:c623c6d5ed16 | 42 | stars.updateAndDrawSmallStars(); |
Noximilien | 39:ca77a6d574e6 | 43 | stars.updateAndDrawMediumStars(); |
Noximilien | 33:c623c6d5ed16 | 44 | stars.starsSpawnDelay(); |
Noximilien | 33:c623c6d5ed16 | 45 | increaseGameDifficultyAndEnemySpawnDelay(); |
Noximilien | 33:c623c6d5ed16 | 46 | hud.displayLifes(); |
Noximilien | 33:c623c6d5ed16 | 47 | hud.drawScore(); |
Noximilien | 33:c623c6d5ed16 | 48 | collideEnemiesAndBlasts(); |
Noximilien | 33:c623c6d5ed16 | 49 | collideEnemiesBlastsAndPlayer(); |
Noximilien | 33:c623c6d5ed16 | 50 | collideEnemiesAndPlayer(); |
Noximilien | 33:c623c6d5ed16 | 51 | enemies.updateAndDrawEnemies(); |
Noximilien | 33:c623c6d5ed16 | 52 | enemies.updateAndDrawEnemyBlasts(); |
Noximilien | 34:754915ce9de5 | 53 | boss.updateAndDrawBossBlasts(); |
Noximilien | 33:c623c6d5ed16 | 54 | |
Noximilien | 34:754915ce9de5 | 55 | if (checkForGameOver()) { game_state = GameState_gameover;} |
Noximilien | 34:754915ce9de5 | 56 | if (is_boss_active) { game_state = GameState_boss_cutscene;} |
Noximilien | 33:c623c6d5ed16 | 57 | } |
Noximilien | 33:c623c6d5ed16 | 58 | |
Noximilien | 33:c623c6d5ed16 | 59 | void Game::updateAndDrawGameover() { |
Noximilien | 33:c623c6d5ed16 | 60 | gameOverManager.updateAndDraw(); |
Noximilien | 37:6a2bf4488022 | 61 | lcd.normalMode(); |
Noximilien | 33:c623c6d5ed16 | 62 | if (gamepad.check_event(gamepad.Y_PRESSED) && !gameOverManager.isPlayingAnimation()) { |
Noximilien | 33:c623c6d5ed16 | 63 | gameOverManager.reset(); |
Noximilien | 33:c623c6d5ed16 | 64 | game_state = GameState_newgame; |
Noximilien | 33:c623c6d5ed16 | 65 | } |
Noximilien | 33:c623c6d5ed16 | 66 | } |
Noximilien | 33:c623c6d5ed16 | 67 | |
Noximilien | 33:c623c6d5ed16 | 68 | void Game::updateAndDrawBossCutscene() { |
Noximilien | 34:754915ce9de5 | 69 | boss.updateCutscene(); |
Noximilien | 34:754915ce9de5 | 70 | enemies.updateAndDrawEnemyBlasts(); |
Noximilien | 34:754915ce9de5 | 71 | boss.draw(); |
Noximilien | 34:754915ce9de5 | 72 | player.draw(); |
Noximilien | 34:754915ce9de5 | 73 | stars.updateAndDrawSmallStars(); |
Noximilien | 34:754915ce9de5 | 74 | stars.updateAndDrawMediumStars(); |
Noximilien | 38:ef3968546d36 | 75 | gamepad.tone(60,2); |
Noximilien | 39:ca77a6d574e6 | 76 | for (int i = 0; i < enemies.max_enemies; ++i) { |
Noximilien | 39:ca77a6d574e6 | 77 | enemies.enemies[i].active = false; |
Noximilien | 39:ca77a6d574e6 | 78 | } |
Noximilien | 39:ca77a6d574e6 | 79 | for (int i = 0; i < enemies.max_enemy_blasts; ++i) { |
Noximilien | 39:ca77a6d574e6 | 80 | enemies.enemy_blasts[i].active = false; |
Noximilien | 39:ca77a6d574e6 | 81 | } |
Noximilien | 34:754915ce9de5 | 82 | if (boss.isFinishedCutscene()) { |
Noximilien | 33:c623c6d5ed16 | 83 | game_state = GameState_boss_gameplay; |
Noximilien | 34:754915ce9de5 | 84 | boss.resetCutscene(); |
Noximilien | 33:c623c6d5ed16 | 85 | } |
Noximilien | 33:c623c6d5ed16 | 86 | } |
Noximilien | 33:c623c6d5ed16 | 87 | |
Noximilien | 33:c623c6d5ed16 | 88 | void Game::updateAndDrawBossGameplay() { |
Noximilien | 33:c623c6d5ed16 | 89 | checkButtonToShoot(); |
Noximilien | 34:754915ce9de5 | 90 | enemies.updateAndDrawEnemyBlasts(); |
Noximilien | 33:c623c6d5ed16 | 91 | player.updateAndDraw(); |
Noximilien | 33:c623c6d5ed16 | 92 | player.updateAndDrawBlasts(); |
Noximilien | 33:c623c6d5ed16 | 93 | stars.updateAndDrawSmallStars(); |
Noximilien | 33:c623c6d5ed16 | 94 | stars.starsSpawnDelay(); |
Noximilien | 33:c623c6d5ed16 | 95 | hud.displayLifes(); |
Noximilien | 33:c623c6d5ed16 | 96 | hud.drawScore(); |
Noximilien | 33:c623c6d5ed16 | 97 | boss.updateAndDrawBossBlasts(); |
Noximilien | 33:c623c6d5ed16 | 98 | collideBossAndPlayerBlasts(); |
Noximilien | 34:754915ce9de5 | 99 | collideBossBlastsAndPlayer(); |
Noximilien | 34:754915ce9de5 | 100 | is_boss_active = boss.updateAndDrawBoss(); |
Noximilien | 34:754915ce9de5 | 101 | if (checkForGameOver()) { game_state = GameState_gameover;} |
Noximilien | 34:754915ce9de5 | 102 | if (!is_boss_active) { game_state = GameState_gameplay;} |
Noximilien | 33:c623c6d5ed16 | 103 | } |
Noximilien | 33:c623c6d5ed16 | 104 | |
Noximilien | 30:d454d0cb72bc | 105 | /** |
Noximilien | 33:c623c6d5ed16 | 106 | * This is the main function of game.cpp, where the actual gameplay happens. |
Noximilien | 33:c623c6d5ed16 | 107 | * Here all other functions are activeated, and when the player dies, it |
Noximilien | 33:c623c6d5ed16 | 108 | * returns back to main menu "main.cpp". |
Noximilien | 33:c623c6d5ed16 | 109 | */ |
Noximilien | 29:579e00b7f118 | 110 | bool Game::updateAndDraw() { |
Noximilien | 33:c623c6d5ed16 | 111 | if (game_state == GameState_newgame) { |
Noximilien | 37:6a2bf4488022 | 112 | DG_PRINTF("start game \n"); |
Noximilien | 29:579e00b7f118 | 113 | startNewGame(); |
Noximilien | 29:579e00b7f118 | 114 | } |
Noximilien | 33:c623c6d5ed16 | 115 | if (game_state == GameState_gameplay) { updateAndDrawGameplay(); } |
Noximilien | 33:c623c6d5ed16 | 116 | else if (game_state == GameState_boss_cutscene) { updateAndDrawBossCutscene(); } |
Noximilien | 33:c623c6d5ed16 | 117 | else if (game_state == GameState_boss_gameplay) { updateAndDrawBossGameplay(); } |
Noximilien | 33:c623c6d5ed16 | 118 | else if (game_state == GameState_gameover) { updateAndDrawGameover(); } |
Noximilien | 33:c623c6d5ed16 | 119 | |
Noximilien | 33:c623c6d5ed16 | 120 | return checkIfNeedsToReturnToMenu(); |
Noximilien | 33:c623c6d5ed16 | 121 | } |
Noximilien | 33:c623c6d5ed16 | 122 | |
Noximilien | 33:c623c6d5ed16 | 123 | void Game::checkButtonToShoot(){ |
Noximilien | 31:becb8f6bf7b7 | 124 | if (gamepad.check_event(gamepad.X_PRESSED) && !GameGlobals::is_shield_on){ |
Noximilien | 29:579e00b7f118 | 125 | // Checking the button second time to prevent double blast. |
Noximilien | 29:579e00b7f118 | 126 | gamepad.check_event(gamepad.X_PRESSED); |
Noximilien | 33:c623c6d5ed16 | 127 | player.fireNewBlast(); |
Noximilien | 29:579e00b7f118 | 128 | gamepad.tone(200,0.1); |
Noximilien | 29:579e00b7f118 | 129 | } |
Noximilien | 29:579e00b7f118 | 130 | } |
Noximilien | 29:579e00b7f118 | 131 | |
Noximilien | 30:d454d0cb72bc | 132 | /** |
Noximilien | 22:4dc3c95f2146 | 133 | * This function checks whether the requirments for the collision of the two objects, |
Noximilien | 22:4dc3c95f2146 | 134 | * are met. When those requirments are met the collision of two objects function will |
Noximilien | 22:4dc3c95f2146 | 135 | * be checking wheter the boundaries of the objects colide. If they do, the blast |
Noximilien | 22:4dc3c95f2146 | 136 | * becomes inactive, in game score increases and enemy dies. |
Noximilien | 22:4dc3c95f2146 | 137 | */ |
Noximilien | 21:0eb394495b8a | 138 | void Game::collideEnemiesAndBlasts() { |
Noximilien | 34:754915ce9de5 | 139 | for (int i = 0; i < enemies.max_enemies; ++i) { |
Noximilien | 33:c623c6d5ed16 | 140 | for (int j = 0; j < player.max_player_blasts; ++j) { |
Noximilien | 21:0eb394495b8a | 141 | Enemy& enemy = enemies.enemies[i]; |
Noximilien | 33:c623c6d5ed16 | 142 | GameObject& blast = player.blasts[j]; |
Noximilien | 21:0eb394495b8a | 143 | if (enemy.active && !enemy.dead && blast.active) { |
Noximilien | 37:6a2bf4488022 | 144 | bool collision = circleCollideTwoObjects( |
Noximilien | 21:0eb394495b8a | 145 | enemy.pos, enemies.enemy_bounds, |
Noximilien | 33:c623c6d5ed16 | 146 | blast.pos, player.blast_bounds |
Noximilien | 12:bfe3a3deaac3 | 147 | ); |
Noximilien | 12:bfe3a3deaac3 | 148 | if (collision) { |
Noximilien | 21:0eb394495b8a | 149 | enemy.die(); |
Noximilien | 37:6a2bf4488022 | 150 | DG_PRINTF("enemy got hit and dies \n"); |
Noximilien | 31:becb8f6bf7b7 | 151 | GameGlobals::game_score += 30; |
Noximilien | 31:becb8f6bf7b7 | 152 | GameGlobals::score_count_for_difficulty +=30; |
Noximilien | 34:754915ce9de5 | 153 | GameGlobals::score_count_for_boss_mode += 30; |
Noximilien | 21:0eb394495b8a | 154 | blast.active = false; |
Noximilien | 12:bfe3a3deaac3 | 155 | } |
Noximilien | 12:bfe3a3deaac3 | 156 | } |
Noximilien | 12:bfe3a3deaac3 | 157 | } |
Noximilien | 12:bfe3a3deaac3 | 158 | } |
Noximilien | 12:bfe3a3deaac3 | 159 | } |
Noximilien | 5:2b9181bc5c89 | 160 | |
Noximilien | 30:d454d0cb72bc | 161 | /** |
Noximilien | 23:240bc00ef25b | 162 | * This code does the same work as the one before but with two other objects. |
Noximilien | 22:4dc3c95f2146 | 163 | * It checks whether the requirments for the collision of the two objects, |
Noximilien | 22:4dc3c95f2146 | 164 | * are met. When those requirments are met the collision of two objects function will |
Noximilien | 22:4dc3c95f2146 | 165 | * be checking wheter the boundaries of the objects colide. If they do, the blast |
Noximilien | 22:4dc3c95f2146 | 166 | * becomes inactive, in game score increases and enemy dies. |
Noximilien | 22:4dc3c95f2146 | 167 | */ |
Noximilien | 21:0eb394495b8a | 168 | void Game::collideEnemiesBlastsAndPlayer() { |
Noximilien | 34:754915ce9de5 | 169 | for (int i = 0; i < enemies.max_enemies; ++i) { |
Noximilien | 21:0eb394495b8a | 170 | GameObject& blast = enemies.enemy_blasts[i]; |
Noximilien | 21:0eb394495b8a | 171 | if (blast.active) { |
Noximilien | 37:6a2bf4488022 | 172 | bool collision = circleCollideTwoObjects( |
Noximilien | 33:c623c6d5ed16 | 173 | player.pos, player.player_bounds, |
Noximilien | 21:0eb394495b8a | 174 | blast.pos, enemies.enemy_blast_bounds |
Noximilien | 21:0eb394495b8a | 175 | ); |
Noximilien | 21:0eb394495b8a | 176 | if (collision) { |
Noximilien | 31:becb8f6bf7b7 | 177 | if (!GameGlobals::is_shield_on){ |
Noximilien | 30:d454d0cb72bc | 178 | gamepad.tone(423,0.4); |
Noximilien | 31:becb8f6bf7b7 | 179 | GameGlobals::player_lifes -= 1; |
Noximilien | 37:6a2bf4488022 | 180 | DG_PRINTF("lost a life from blast. left: %i \n", GameGlobals::player_lifes); |
Noximilien | 30:d454d0cb72bc | 181 | blast.active = false; |
Noximilien | 30:d454d0cb72bc | 182 | }else{ |
Noximilien | 30:d454d0cb72bc | 183 | blast.active = false; |
Noximilien | 30:d454d0cb72bc | 184 | gamepad.tone(700,0.6); |
Noximilien | 30:d454d0cb72bc | 185 | } |
Noximilien | 18:6becc9f9de5e | 186 | } |
Noximilien | 18:6becc9f9de5e | 187 | } |
Noximilien | 18:6becc9f9de5e | 188 | } |
Noximilien | 18:6becc9f9de5e | 189 | } |
Noximilien | 26:676874c42883 | 190 | |
Noximilien | 30:d454d0cb72bc | 191 | /** |
Noximilien | 23:240bc00ef25b | 192 | * This code does the same work as the one before but with two other object. |
Noximilien | 23:240bc00ef25b | 193 | * of enemy ship and the player's ship |
Noximilien | 22:4dc3c95f2146 | 194 | */ |
Noximilien | 23:240bc00ef25b | 195 | void Game::collideEnemiesAndPlayer() { |
Noximilien | 34:754915ce9de5 | 196 | for (int i = 0; i < enemies.max_enemies; ++i) { |
Noximilien | 23:240bc00ef25b | 197 | Enemy& enemy = enemies.enemies[i]; |
Noximilien | 23:240bc00ef25b | 198 | if (enemy.active && !enemy.dead) { |
Noximilien | 37:6a2bf4488022 | 199 | bool collision = circleCollideTwoObjects( |
Noximilien | 33:c623c6d5ed16 | 200 | player.pos, player.player_bounds, |
Noximilien | 23:240bc00ef25b | 201 | enemy.pos, enemies.enemy_bounds |
Noximilien | 23:240bc00ef25b | 202 | ); |
Noximilien | 23:240bc00ef25b | 203 | if (collision) { |
Noximilien | 31:becb8f6bf7b7 | 204 | GameGlobals::player_lifes -= 1; |
Noximilien | 36:207ec7db8648 | 205 | |
Noximilien | 23:240bc00ef25b | 206 | enemy.die(); |
Noximilien | 37:6a2bf4488022 | 207 | DG_PRINTF("enemy got hit from collsion and dies"); |
Noximilien | 37:6a2bf4488022 | 208 | DG_PRINTF("lost a life from enemy col. left: %i \n", GameGlobals::player_lifes); |
Noximilien | 33:c623c6d5ed16 | 209 | } |
Noximilien | 33:c623c6d5ed16 | 210 | } |
Noximilien | 33:c623c6d5ed16 | 211 | } |
Noximilien | 33:c623c6d5ed16 | 212 | } |
Noximilien | 33:c623c6d5ed16 | 213 | |
Noximilien | 33:c623c6d5ed16 | 214 | void Game::collideBossAndPlayerBlasts() { |
Noximilien | 33:c623c6d5ed16 | 215 | for (int i = 0; i < player.max_player_blasts; ++i) { |
Noximilien | 33:c623c6d5ed16 | 216 | GameObject& blast = player.blasts[i]; |
Noximilien | 33:c623c6d5ed16 | 217 | if (blast.active) { |
Noximilien | 37:6a2bf4488022 | 218 | bool collision = circleCollideTwoObjects( |
Noximilien | 33:c623c6d5ed16 | 219 | boss.pos, boss.boss_bounds, |
Noximilien | 33:c623c6d5ed16 | 220 | blast.pos, player.blast_bounds |
Noximilien | 33:c623c6d5ed16 | 221 | ); |
Noximilien | 33:c623c6d5ed16 | 222 | if (collision) { |
Noximilien | 34:754915ce9de5 | 223 | boss.boss_lives -= 1; |
Noximilien | 33:c623c6d5ed16 | 224 | gamepad.tone(123,0.4); |
Noximilien | 33:c623c6d5ed16 | 225 | blast.active = false; |
Noximilien | 37:6a2bf4488022 | 226 | DG_PRINTF("boss has. left: %i \n", boss.boss_lives); |
Noximilien | 34:754915ce9de5 | 227 | } |
Noximilien | 34:754915ce9de5 | 228 | } |
Noximilien | 34:754915ce9de5 | 229 | } |
Noximilien | 34:754915ce9de5 | 230 | } |
Noximilien | 34:754915ce9de5 | 231 | |
Noximilien | 34:754915ce9de5 | 232 | void Game::collideBossBlastsAndPlayer() { |
Noximilien | 34:754915ce9de5 | 233 | for (int i = 0; i < boss.max_boss_blasts; ++i) { |
Noximilien | 34:754915ce9de5 | 234 | GameObject& blast = boss.boss_blasts[i]; |
Noximilien | 34:754915ce9de5 | 235 | if (blast.active) { |
Noximilien | 37:6a2bf4488022 | 236 | bool collision = circleCollideTwoObjects( |
Noximilien | 34:754915ce9de5 | 237 | player.pos, player.player_bounds, |
Noximilien | 34:754915ce9de5 | 238 | blast.pos, boss.boss_blast_bounds |
Noximilien | 34:754915ce9de5 | 239 | ); |
Noximilien | 37:6a2bf4488022 | 240 | DG_PRINTF("player pos:%i,%i; offset:%i,%i; radius:%f.3; \n", player.pos.x, player.pos.y, player.player_bounds.center.x, player.player_bounds.center.y, player.player_bounds.radius); |
Noximilien | 39:ca77a6d574e6 | 241 | DG_PRINTF("blast pos:%i,%i; offset:%i,%i; radius:%f.3; \n", blast.pos.x, blast.pos.y, boss.boss_blast_bounds.center.x, boss.boss_blast_bounds.center.y, boss.boss_blast_bounds.radius); |
Noximilien | 34:754915ce9de5 | 242 | if (collision) { |
Noximilien | 34:754915ce9de5 | 243 | if (!GameGlobals::is_shield_on){ |
Noximilien | 34:754915ce9de5 | 244 | |
Noximilien | 34:754915ce9de5 | 245 | gamepad.tone(423,0.4); |
Noximilien | 34:754915ce9de5 | 246 | GameGlobals::player_lifes -= 1; |
Noximilien | 34:754915ce9de5 | 247 | blast.active = false; |
Noximilien | 37:6a2bf4488022 | 248 | DG_PRINTF("collision happened;\n"); |
Noximilien | 37:6a2bf4488022 | 249 | DG_PRINTF("lost a life from blast. left: %i \n", GameGlobals::player_lifes); |
Noximilien | 34:754915ce9de5 | 250 | }else{ |
Noximilien | 34:754915ce9de5 | 251 | blast.active = false; |
Noximilien | 34:754915ce9de5 | 252 | gamepad.tone(700,0.6); |
Noximilien | 34:754915ce9de5 | 253 | } |
Noximilien | 23:240bc00ef25b | 254 | } |
Noximilien | 23:240bc00ef25b | 255 | } |
Noximilien | 23:240bc00ef25b | 256 | } |
Noximilien | 13:5c3dc6e827c2 | 257 | } |
Noximilien | 13:5c3dc6e827c2 | 258 | |
Noximilien | 30:d454d0cb72bc | 259 | /** |
Noximilien | 26:676874c42883 | 260 | * This function resets all the values to their intial states when the game is |
Noximilien | 26:676874c42883 | 261 | * first began when the player dies and wants to restart the game. |
Noximilien | 23:240bc00ef25b | 262 | * It does not reset the values when the game is paused. |
Noximilien | 23:240bc00ef25b | 263 | */ |
Noximilien | 21:0eb394495b8a | 264 | void Game::startNewGame() { |
Noximilien | 34:754915ce9de5 | 265 | is_boss_active = false; |
Noximilien | 39:ca77a6d574e6 | 266 | game_state = GameState_gameplay; |
Noximilien | 33:c623c6d5ed16 | 267 | player.pos.x = 0; //player was defined in player.h |
Noximilien | 33:c623c6d5ed16 | 268 | player.pos.y = 24; |
Noximilien | 31:becb8f6bf7b7 | 269 | stars.stars_delay = 0; |
Noximilien | 26:676874c42883 | 270 | enemy_ship_delay_max = 40; |
Noximilien | 26:676874c42883 | 271 | enemy_ship_delay_counter = enemy_ship_delay_max; |
Noximilien | 31:becb8f6bf7b7 | 272 | GameGlobals::is_shield_on = false; |
Noximilien | 31:becb8f6bf7b7 | 273 | GameGlobals::game_score = 0; |
Noximilien | 31:becb8f6bf7b7 | 274 | GameGlobals::score_count_for_difficulty = 0; |
Noximilien | 31:becb8f6bf7b7 | 275 | GameGlobals::player_lifes = 3; |
Noximilien | 34:754915ce9de5 | 276 | GameGlobals::score_count_for_boss_mode = 0; |
Noximilien | 31:becb8f6bf7b7 | 277 | hud.resetRedLed(); |
Noximilien | 34:754915ce9de5 | 278 | enemies.enemy_blast_speed = 3; |
Noximilien | 34:754915ce9de5 | 279 | enemy.enemy_speed = 1; |
Noximilien | 38:ef3968546d36 | 280 | gamepad.check_event(gamepad.START_PRESSED); |
Noximilien | 34:754915ce9de5 | 281 | for (int i = 0; i < enemies.max_enemies; ++i) { |
Noximilien | 21:0eb394495b8a | 282 | enemies.enemies[i].active = false; |
Noximilien | 13:5c3dc6e827c2 | 283 | } |
Noximilien | 33:c623c6d5ed16 | 284 | for (int i = 0; i < player.max_player_blasts; ++i) { |
Noximilien | 33:c623c6d5ed16 | 285 | player.blasts[i].active = false; |
Noximilien | 13:5c3dc6e827c2 | 286 | } |
Noximilien | 34:754915ce9de5 | 287 | for (int i = 0; i < enemies.max_enemy_blasts; ++i) { |
Noximilien | 21:0eb394495b8a | 288 | enemies.enemy_blasts[i].active = false; |
Noximilien | 13:5c3dc6e827c2 | 289 | } |
Noximilien | 34:754915ce9de5 | 290 | for (int i = 0; i < boss.max_boss_blasts; ++i) { |
Noximilien | 34:754915ce9de5 | 291 | boss.boss_blasts[i].active = false; |
Noximilien | 34:754915ce9de5 | 292 | } |
Noximilien | 36:207ec7db8648 | 293 | gamepad.check_event(gamepad.START_PRESSED); |
Noximilien | 13:5c3dc6e827c2 | 294 | } |
Noximilien | 13:5c3dc6e827c2 | 295 | |
Noximilien | 30:d454d0cb72bc | 296 | /** |
Noximilien | 26:676874c42883 | 297 | * A function tbat delays enemy spawn on low game score. |
Noximilien | 26:676874c42883 | 298 | * It decreases the enemy spawn delay as in game score increases. |
Noximilien | 29:579e00b7f118 | 299 | * The enemy spawn delay is located in game.cpp because the game difficulty |
Noximilien | 29:579e00b7f118 | 300 | * depends on the on how fast enemy appears. |
Noximilien | 26:676874c42883 | 301 | */ |
Noximilien | 26:676874c42883 | 302 | void Game::increaseGameDifficultyAndEnemySpawnDelay(){ |
Noximilien | 26:676874c42883 | 303 | if (enemy_ship_delay_counter <= 0){ |
Noximilien | 26:676874c42883 | 304 | enemies.spawnNewEnemy(); |
Noximilien | 26:676874c42883 | 305 | enemy_ship_delay_counter = enemy_ship_delay_max; |
Noximilien | 26:676874c42883 | 306 | } |
Noximilien | 26:676874c42883 | 307 | else { enemy_ship_delay_counter -= 1;} |
Noximilien | 26:676874c42883 | 308 | |
Noximilien | 31:becb8f6bf7b7 | 309 | if (enemy_ship_delay_max >= 4 && GameGlobals::score_count_for_difficulty >= increase_difficulty){ |
Noximilien | 29:579e00b7f118 | 310 | //decrease enemy delay spawn. |
Noximilien | 26:676874c42883 | 311 | enemy_ship_delay_max -= 3; |
Noximilien | 26:676874c42883 | 312 | if (enemy_ship_delay_max <= 20 && enemy_ship_delay_max >= 15){ |
Noximilien | 34:754915ce9de5 | 313 | enemies.enemy_blast_speed += 1; |
Noximilien | 34:754915ce9de5 | 314 | enemy.enemy_speed += 1; |
Noximilien | 26:676874c42883 | 315 | } |
Noximilien | 31:becb8f6bf7b7 | 316 | GameGlobals::score_count_for_difficulty = 0; |
Noximilien | 26:676874c42883 | 317 | } |
Noximilien | 34:754915ce9de5 | 318 | if (GameGlobals::score_count_for_boss_mode >= 400){ |
Noximilien | 34:754915ce9de5 | 319 | is_boss_active = true; |
Noximilien | 31:becb8f6bf7b7 | 320 | lcd.inverseMode(); |
Noximilien | 31:becb8f6bf7b7 | 321 | } |
Noximilien | 26:676874c42883 | 322 | } |
Noximilien | 26:676874c42883 | 323 | |
Noximilien | 30:d454d0cb72bc | 324 | bool Game::forceShildActivate(){ |
Noximilien | 30:d454d0cb72bc | 325 | if (gamepad.check_event(gamepad.R_PRESSED)){ |
Noximilien | 31:becb8f6bf7b7 | 326 | GameGlobals::is_shield_on = !GameGlobals::is_shield_on; |
Noximilien | 30:d454d0cb72bc | 327 | } |
Noximilien | 31:becb8f6bf7b7 | 328 | return GameGlobals::is_shield_on; |
Noximilien | 30:d454d0cb72bc | 329 | } |
Noximilien | 30:d454d0cb72bc | 330 | |
Noximilien | 30:d454d0cb72bc | 331 | /** |
Noximilien | 27:f05f4e738ba9 | 332 | * This is a single line function to set the player lifes to 0 when the. |
Noximilien | 27:f05f4e738ba9 | 333 | * game is over. |
Noximilien | 27:f05f4e738ba9 | 334 | */ |
Noximilien | 27:f05f4e738ba9 | 335 | bool Game::checkForGameOver() { |
Noximilien | 34:754915ce9de5 | 336 | return GameGlobals::player_lifes <= 0; |
Noximilien | 28:35af3843de8f | 337 | } |
Noximilien | 29:579e00b7f118 | 338 | |
Noximilien | 30:d454d0cb72bc | 339 | /** This small statment checks whether the pause button was pressed or not. |
Noximilien | 30:d454d0cb72bc | 340 | * If it was pressed, then the game will go back to main menu and will save |
Noximilien | 30:d454d0cb72bc | 341 | * the current status of the object until the game is continued. |
Noximilien | 30:d454d0cb72bc | 342 | */ |
Noximilien | 33:c623c6d5ed16 | 343 | bool Game::checkIfNeedsToReturnToMenu(){ |
Noximilien | 30:d454d0cb72bc | 344 | bool want_to_pause = false; |
Noximilien | 33:c623c6d5ed16 | 345 | |
Noximilien | 30:d454d0cb72bc | 346 | if (gamepad.check_event(gamepad.START_PRESSED)){ |
Noximilien | 37:6a2bf4488022 | 347 | DG_PRINTF("game paused\n"); |
Noximilien | 30:d454d0cb72bc | 348 | gamepad.check_event(gamepad.START_PRESSED); |
Noximilien | 38:ef3968546d36 | 349 | gamepad.check_event(gamepad.A_PRESSED); |
Noximilien | 30:d454d0cb72bc | 350 | want_to_pause = true; |
Noximilien | 30:d454d0cb72bc | 351 | } |
Noximilien | 30:d454d0cb72bc | 352 | return want_to_pause; |
Noximilien | 26:676874c42883 | 353 | } |