ELEC2645 (2018/19) / Mbed 2 deprecated el17dg

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

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?

UserRevisionLine numberNew 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