Initial publish
Dependencies: mbed
Fork of el17dg by
game/game.cpp@12:bfe3a3deaac3, 2019-03-17 (annotated)
- Committer:
- Noximilien
- Date:
- Sun Mar 17 09:44:59 2019 +0000
- Revision:
- 12:bfe3a3deaac3
- Parent:
- 11:cf2ba52e8b7e
- Child:
- 13:5c3dc6e827c2
I have decided to switch from class to struct. So far I have changed the enemy and blast, still, need to change stars and menu. I have made a collision function for blast and enemy. Need to create interesting enemy death.
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 | 9:5ad5501c702e | 10 | #include "stars.h" |
Noximilien | 12:bfe3a3deaac3 | 11 | //#include "planets.h" |
Noximilien | 3:10918b0f7a7d | 12 | |
Noximilien | 5:2b9181bc5c89 | 13 | |
Noximilien | 5:2b9181bc5c89 | 14 | int x_ship_pos = 0; |
Noximilien | 5:2b9181bc5c89 | 15 | int y_ship_pos = 24; |
Noximilien | 11:cf2ba52e8b7e | 16 | int small_star_delay = 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 | 6:100b46be4bea | 20 | |
Noximilien | 12:bfe3a3deaac3 | 21 | |
Noximilien | 12:bfe3a3deaac3 | 22 | struct GameObject { |
Noximilien | 12:bfe3a3deaac3 | 23 | int x; |
Noximilien | 12:bfe3a3deaac3 | 24 | int y; |
Noximilien | 12:bfe3a3deaac3 | 25 | bool active; |
Noximilien | 12:bfe3a3deaac3 | 26 | }; |
Noximilien | 9:5ad5501c702e | 27 | |
Noximilien | 12:bfe3a3deaac3 | 28 | struct Enemy : public GameObject { |
Noximilien | 12:bfe3a3deaac3 | 29 | bool dead; |
Noximilien | 12:bfe3a3deaac3 | 30 | int dead_counter; |
Noximilien | 12:bfe3a3deaac3 | 31 | }; |
Noximilien | 12:bfe3a3deaac3 | 32 | |
Noximilien | 12:bfe3a3deaac3 | 33 | #define MAX_BLASTS (5) |
Noximilien | 12:bfe3a3deaac3 | 34 | GameObject blasts[MAX_BLASTS]; |
Noximilien | 12:bfe3a3deaac3 | 35 | const float blast_collision_radius = 1; |
Noximilien | 12:bfe3a3deaac3 | 36 | const float blast_collision_offset_x = 1; |
Noximilien | 12:bfe3a3deaac3 | 37 | const float blast_collision_offset_y = 0; |
Noximilien | 12:bfe3a3deaac3 | 38 | |
Noximilien | 12:bfe3a3deaac3 | 39 | #define MAX_SMALL_STARS (5) |
Noximilien | 11:cf2ba52e8b7e | 40 | Stars small_stars[MAX_SMALL_STARS]; |
Noximilien | 12:bfe3a3deaac3 | 41 | |
Noximilien | 12:bfe3a3deaac3 | 42 | #define MAX_MEDIUM_STARS (10) |
Noximilien | 11:cf2ba52e8b7e | 43 | Stars medium_stars[MAX_MEDIUM_STARS]; |
Noximilien | 11:cf2ba52e8b7e | 44 | |
Noximilien | 12:bfe3a3deaac3 | 45 | #define MAX_ENEMIES (1) |
Noximilien | 12:bfe3a3deaac3 | 46 | Enemy enemies[MAX_ENEMIES]; |
Noximilien | 12:bfe3a3deaac3 | 47 | const float enemy_collision_radius = 8; |
Noximilien | 12:bfe3a3deaac3 | 48 | const float enemy_collision_offset_x = 5; |
Noximilien | 12:bfe3a3deaac3 | 49 | const float enemy_collision_offset_y = 3; |
Noximilien | 12:bfe3a3deaac3 | 50 | |
Noximilien | 12:bfe3a3deaac3 | 51 | |
Noximilien | 12:bfe3a3deaac3 | 52 | GameObject player; |
Noximilien | 12:bfe3a3deaac3 | 53 | |
Noximilien | 12:bfe3a3deaac3 | 54 | void spawnNewEnemy() { |
Noximilien | 12:bfe3a3deaac3 | 55 | int found = -1; |
Noximilien | 12:bfe3a3deaac3 | 56 | for (int i = 0; i < MAX_ENEMIES; ++i) { |
Noximilien | 12:bfe3a3deaac3 | 57 | if (!enemies[i].active) { |
Noximilien | 12:bfe3a3deaac3 | 58 | found = i; |
Noximilien | 12:bfe3a3deaac3 | 59 | break; |
Noximilien | 12:bfe3a3deaac3 | 60 | } |
Noximilien | 12:bfe3a3deaac3 | 61 | } |
Noximilien | 12:bfe3a3deaac3 | 62 | |
Noximilien | 12:bfe3a3deaac3 | 63 | if (found != -1) { |
Noximilien | 12:bfe3a3deaac3 | 64 | enemies[found].dead = false; |
Noximilien | 12:bfe3a3deaac3 | 65 | enemies[found].active = true; |
Noximilien | 12:bfe3a3deaac3 | 66 | enemies[found].x = screen_width; |
Noximilien | 12:bfe3a3deaac3 | 67 | enemies[found].y = rand() % (screen_height - enemy_height); |
Noximilien | 12:bfe3a3deaac3 | 68 | |
Noximilien | 12:bfe3a3deaac3 | 69 | } |
Noximilien | 12:bfe3a3deaac3 | 70 | } |
Noximilien | 12:bfe3a3deaac3 | 71 | |
Noximilien | 12:bfe3a3deaac3 | 72 | void updateAndDrawEnemies() { |
Noximilien | 12:bfe3a3deaac3 | 73 | const int enemy_speed = 2; |
Noximilien | 12:bfe3a3deaac3 | 74 | for (int i = 0; i < MAX_ENEMIES; ++i) { |
Noximilien | 12:bfe3a3deaac3 | 75 | if (enemies[i].active){ |
Noximilien | 12:bfe3a3deaac3 | 76 | enemies[i].x -= enemy_speed; |
Noximilien | 12:bfe3a3deaac3 | 77 | if (!enemies[i].dead) { |
Noximilien | 12:bfe3a3deaac3 | 78 | lcd.drawSprite(enemies[i].x, enemies[i].y, 7, 11, (int*)enemyShip2); |
Noximilien | 12:bfe3a3deaac3 | 79 | } else { |
Noximilien | 12:bfe3a3deaac3 | 80 | if (enemies[i].dead_counter > 0) { |
Noximilien | 12:bfe3a3deaac3 | 81 | enemies[i].dead_counter--; |
Noximilien | 12:bfe3a3deaac3 | 82 | lcd.drawSprite(enemies[i].x, enemies[i].y, 7, 11, (int*)enemyExploded); |
Noximilien | 12:bfe3a3deaac3 | 83 | } else { |
Noximilien | 12:bfe3a3deaac3 | 84 | enemies[i].active = false; |
Noximilien | 12:bfe3a3deaac3 | 85 | } |
Noximilien | 12:bfe3a3deaac3 | 86 | } |
Noximilien | 12:bfe3a3deaac3 | 87 | if (enemies[i].x < -5){ |
Noximilien | 12:bfe3a3deaac3 | 88 | enemies[i].active = false; |
Noximilien | 12:bfe3a3deaac3 | 89 | } |
Noximilien | 12:bfe3a3deaac3 | 90 | } |
Noximilien | 12:bfe3a3deaac3 | 91 | } |
Noximilien | 12:bfe3a3deaac3 | 92 | } |
Noximilien | 12:bfe3a3deaac3 | 93 | |
Noximilien | 12:bfe3a3deaac3 | 94 | void updateAndDrawBlasts() { |
Noximilien | 12:bfe3a3deaac3 | 95 | const int blast_speed = 5; |
Noximilien | 12:bfe3a3deaac3 | 96 | for (int i = 0; i < MAX_BLASTS; ++i) { |
Noximilien | 12:bfe3a3deaac3 | 97 | if (blasts[i].active) { |
Noximilien | 12:bfe3a3deaac3 | 98 | blasts[i].x += blast_speed; |
Noximilien | 12:bfe3a3deaac3 | 99 | if (blasts[i].x >= screen_width){ |
Noximilien | 12:bfe3a3deaac3 | 100 | blasts[i].active = false; |
Noximilien | 12:bfe3a3deaac3 | 101 | } |
Noximilien | 12:bfe3a3deaac3 | 102 | lcd.setPixel(blasts[i].x, blasts[i].y, 1); |
Noximilien | 12:bfe3a3deaac3 | 103 | lcd.setPixel(blasts[i].x+1, blasts[i].y, 1); |
Noximilien | 12:bfe3a3deaac3 | 104 | lcd.setPixel(blasts[i].x+2, blasts[i].y, 1); |
Noximilien | 12:bfe3a3deaac3 | 105 | } |
Noximilien | 12:bfe3a3deaac3 | 106 | } |
Noximilien | 12:bfe3a3deaac3 | 107 | } |
Noximilien | 12:bfe3a3deaac3 | 108 | |
Noximilien | 12:bfe3a3deaac3 | 109 | void fireNewBlast() { |
Noximilien | 12:bfe3a3deaac3 | 110 | // Search the array of blasts if inactive we can use it. |
Noximilien | 12:bfe3a3deaac3 | 111 | int found = -1; |
Noximilien | 12:bfe3a3deaac3 | 112 | for (int i = 0; i < MAX_BLASTS; ++i) { |
Noximilien | 12:bfe3a3deaac3 | 113 | if (!blasts[i].active) { |
Noximilien | 12:bfe3a3deaac3 | 114 | found = i; |
Noximilien | 12:bfe3a3deaac3 | 115 | break; |
Noximilien | 12:bfe3a3deaac3 | 116 | } |
Noximilien | 12:bfe3a3deaac3 | 117 | } |
Noximilien | 12:bfe3a3deaac3 | 118 | |
Noximilien | 12:bfe3a3deaac3 | 119 | if (found != -1) { |
Noximilien | 12:bfe3a3deaac3 | 120 | blasts[found].active = true; |
Noximilien | 12:bfe3a3deaac3 | 121 | blasts[found].x = x_ship_pos + spaceship1_width; |
Noximilien | 12:bfe3a3deaac3 | 122 | blasts[found].y = y_ship_pos + (spaceship1_height/2); |
Noximilien | 12:bfe3a3deaac3 | 123 | } |
Noximilien | 12:bfe3a3deaac3 | 124 | } |
Noximilien | 12:bfe3a3deaac3 | 125 | |
Noximilien | 12:bfe3a3deaac3 | 126 | inline bool circleCollideTwoObjects( |
Noximilien | 12:bfe3a3deaac3 | 127 | int x1, int y1, float r1, float offset_x1, float offset_y1, |
Noximilien | 12:bfe3a3deaac3 | 128 | int x2, int y2, float r2, float offset_x2, float offset_y2 |
Noximilien | 12:bfe3a3deaac3 | 129 | ) { |
Noximilien | 12:bfe3a3deaac3 | 130 | int distance = pow((x1 + offset_x1) - (x2 + offset_x2), 2) + pow((y1 + offset_y1) - (y2 + offset_y2), 2); |
Noximilien | 12:bfe3a3deaac3 | 131 | return distance <= pow(r1 + r2, 2); |
Noximilien | 12:bfe3a3deaac3 | 132 | } |
Noximilien | 12:bfe3a3deaac3 | 133 | |
Noximilien | 12:bfe3a3deaac3 | 134 | void collideEnemiesAndBlasts() { |
Noximilien | 12:bfe3a3deaac3 | 135 | for (int i = 0; i < MAX_ENEMIES; ++i) { |
Noximilien | 12:bfe3a3deaac3 | 136 | for (int j = 0; j < MAX_BLASTS; ++j) { |
Noximilien | 12:bfe3a3deaac3 | 137 | if (enemies[i].active && !enemies[i].dead && blasts[j].active) { |
Noximilien | 12:bfe3a3deaac3 | 138 | bool collision = circleCollideTwoObjects( |
Noximilien | 12:bfe3a3deaac3 | 139 | enemies[i].x, enemies[i].y, enemy_collision_radius, enemy_collision_offset_x, enemy_collision_offset_y, |
Noximilien | 12:bfe3a3deaac3 | 140 | blasts[j].x, blasts[j].y, blast_collision_radius, blast_collision_offset_x, blast_collision_offset_y |
Noximilien | 12:bfe3a3deaac3 | 141 | ); |
Noximilien | 12:bfe3a3deaac3 | 142 | if (collision) { |
Noximilien | 12:bfe3a3deaac3 | 143 | enemies[i].dead = true; |
Noximilien | 12:bfe3a3deaac3 | 144 | enemies[i].dead_counter = 3; |
Noximilien | 12:bfe3a3deaac3 | 145 | blasts[j].active = false; |
Noximilien | 12:bfe3a3deaac3 | 146 | } |
Noximilien | 12:bfe3a3deaac3 | 147 | } |
Noximilien | 12:bfe3a3deaac3 | 148 | } |
Noximilien | 12:bfe3a3deaac3 | 149 | } |
Noximilien | 12:bfe3a3deaac3 | 150 | } |
Noximilien | 5:2b9181bc5c89 | 151 | |
Noximilien | 4:02c63aaa2df9 | 152 | bool Game::updateAndDraw() { |
Noximilien | 6:100b46be4bea | 153 | |
Noximilien | 6:100b46be4bea | 154 | shipMovment(); |
Noximilien | 7:42376925945c | 155 | |
Noximilien | 6:100b46be4bea | 156 | if (gamepad.check_event(gamepad.B_PRESSED)){ |
Noximilien | 9:5ad5501c702e | 157 | fireNewBlast(); |
Noximilien | 6:100b46be4bea | 158 | } |
Noximilien | 11:cf2ba52e8b7e | 159 | if (small_star_delay == small_star_delay_max){ |
Noximilien | 11:cf2ba52e8b7e | 160 | //This is dealy between small stars generation. |
Noximilien | 11:cf2ba52e8b7e | 161 | newSmallStarFlies(); |
Noximilien | 11:cf2ba52e8b7e | 162 | newMediumStarFlies(); |
Noximilien | 12:bfe3a3deaac3 | 163 | spawnNewEnemy(); |
Noximilien | 12:bfe3a3deaac3 | 164 | |
Noximilien | 11:cf2ba52e8b7e | 165 | small_star_delay = 0; |
Noximilien | 10:f02413ae09fe | 166 | } |
Noximilien | 10:f02413ae09fe | 167 | else { |
Noximilien | 11:cf2ba52e8b7e | 168 | small_star_delay += 1; |
Noximilien | 10:f02413ae09fe | 169 | } |
Noximilien | 7:42376925945c | 170 | |
Noximilien | 9:5ad5501c702e | 171 | updateAndDrawBlasts(); |
Noximilien | 11:cf2ba52e8b7e | 172 | updateAndDrawSmallStars(); |
Noximilien | 11:cf2ba52e8b7e | 173 | updateAndDrawMediumStars(); |
Noximilien | 12:bfe3a3deaac3 | 174 | updateAndDrawEnemies(); |
Noximilien | 12:bfe3a3deaac3 | 175 | collideEnemiesAndBlasts(); |
Noximilien | 5:2b9181bc5c89 | 176 | |
Noximilien | 9:5ad5501c702e | 177 | lcd.drawSpriteOnTop(x_ship_pos, y_ship_pos, spaceship1_width, spaceship1_height, (int *)spaceShip1); |
Noximilien | 5:2b9181bc5c89 | 178 | /*char buffer[4]; |
Noximilien | 5:2b9181bc5c89 | 179 | sprintf(buffer,"%i\n",(int)(x_dir.read()*84)); |
Noximilien | 5:2b9181bc5c89 | 180 | printf(buffer);*/ |
Noximilien | 3:10918b0f7a7d | 181 | |
Noximilien | 4:02c63aaa2df9 | 182 | bool want_to_pause = false; |
Noximilien | 4:02c63aaa2df9 | 183 | if (gamepad.check_event(gamepad.START_PRESSED)){ |
Noximilien | 7:42376925945c | 184 | |
Noximilien | 4:02c63aaa2df9 | 185 | want_to_pause = true; |
Noximilien | 4:02c63aaa2df9 | 186 | } |
Noximilien | 4:02c63aaa2df9 | 187 | return want_to_pause; |
Noximilien | 4:02c63aaa2df9 | 188 | } |
Noximilien | 5:2b9181bc5c89 | 189 | |
Noximilien | 5:2b9181bc5c89 | 190 | |
Noximilien | 5:2b9181bc5c89 | 191 | void Game::shipMovment(){ // The position of the ship |
Noximilien | 5:2b9181bc5c89 | 192 | |
Noximilien | 5:2b9181bc5c89 | 193 | if(x_ship_pos <= 48 && x_ship_pos >= 0){ |
Noximilien | 5:2b9181bc5c89 | 194 | if(x_dir.read() > 0.6f){ |
Noximilien | 8:c18c240665aa | 195 | x_ship_pos -= ship_speed; |
Noximilien | 5:2b9181bc5c89 | 196 | } |
Noximilien | 5:2b9181bc5c89 | 197 | else if(x_dir.read() < 0.4f){ |
Noximilien | 8:c18c240665aa | 198 | x_ship_pos += ship_speed; |
Noximilien | 5:2b9181bc5c89 | 199 | } |
Noximilien | 5:2b9181bc5c89 | 200 | } |
Noximilien | 5:2b9181bc5c89 | 201 | |
Noximilien | 5:2b9181bc5c89 | 202 | else if (x_ship_pos <= 48){ x_ship_pos = 0;} //Limits for x direction border IMPROVE IF POSSIBLE. |
Noximilien | 5:2b9181bc5c89 | 203 | else { x_ship_pos = 48;} |
Noximilien | 5:2b9181bc5c89 | 204 | |
Noximilien | 5:2b9181bc5c89 | 205 | |
Noximilien | 5:2b9181bc5c89 | 206 | if (y_ship_pos <= (47 - spaceship1_height) && y_ship_pos >= 0){ |
Noximilien | 5:2b9181bc5c89 | 207 | if(y_dir.read() > 0.6f){ |
Noximilien | 8:c18c240665aa | 208 | y_ship_pos -= ship_speed; |
Noximilien | 5:2b9181bc5c89 | 209 | } |
Noximilien | 5:2b9181bc5c89 | 210 | else if(y_dir.read() < 0.4f){ |
Noximilien | 8:c18c240665aa | 211 | y_ship_pos += ship_speed; |
Noximilien | 5:2b9181bc5c89 | 212 | } |
Noximilien | 5:2b9181bc5c89 | 213 | } |
Noximilien | 5:2b9181bc5c89 | 214 | else if (y_ship_pos >= (47 - spaceship1_height)){ y_ship_pos = 47 - spaceship1_height;} //Limits for y direction border IMPROVE IF POSSIBLE. |
Noximilien | 5:2b9181bc5c89 | 215 | else if (y_ship_pos < 0){ y_ship_pos = 0;} |
Noximilien | 5:2b9181bc5c89 | 216 | |
Noximilien | 5:2b9181bc5c89 | 217 | } |
Noximilien | 5:2b9181bc5c89 | 218 | |
Noximilien | 11:cf2ba52e8b7e | 219 | void Game::newSmallStarFlies() { |
Noximilien | 10:f02413ae09fe | 220 | // Search the array of stars if inactive we can use it. - the same as with blasts |
Noximilien | 11:cf2ba52e8b7e | 221 | int found_inactive_small_star = -1; |
Noximilien | 11:cf2ba52e8b7e | 222 | for (int i = 0; i < MAX_SMALL_STARS; ++i) { |
Noximilien | 11:cf2ba52e8b7e | 223 | if (!small_stars[i].isSmallStarActive()) { |
Noximilien | 11:cf2ba52e8b7e | 224 | found_inactive_small_star = i; |
Noximilien | 10:f02413ae09fe | 225 | break; |
Noximilien | 10:f02413ae09fe | 226 | } |
Noximilien | 10:f02413ae09fe | 227 | } |
Noximilien | 10:f02413ae09fe | 228 | |
Noximilien | 11:cf2ba52e8b7e | 229 | if (found_inactive_small_star != -1) { |
Noximilien | 12:bfe3a3deaac3 | 230 | small_stars[found_inactive_small_star].smallStarActivate(screen_width, rand() % screen_height); |
Noximilien | 10:f02413ae09fe | 231 | } |
Noximilien | 10:f02413ae09fe | 232 | } |
Noximilien | 10:f02413ae09fe | 233 | |
Noximilien | 11:cf2ba52e8b7e | 234 | void Game::updateAndDrawSmallStars(){ |
Noximilien | 11:cf2ba52e8b7e | 235 | for (int i = 0; i < MAX_SMALL_STARS; ++i) { |
Noximilien | 11:cf2ba52e8b7e | 236 | if (small_stars[i].isSmallStarActive()) { |
Noximilien | 11:cf2ba52e8b7e | 237 | small_stars[i].updateAndDrawSmallStar(); |
Noximilien | 10:f02413ae09fe | 238 | } |
Noximilien | 10:f02413ae09fe | 239 | } |
Noximilien | 10:f02413ae09fe | 240 | } |
Noximilien | 10:f02413ae09fe | 241 | |
Noximilien | 11:cf2ba52e8b7e | 242 | |
Noximilien | 11:cf2ba52e8b7e | 243 | void Game::newMediumStarFlies() { |
Noximilien | 11:cf2ba52e8b7e | 244 | // Search the array of stars if inactive we can use it. - the same as with blasts |
Noximilien | 11:cf2ba52e8b7e | 245 | int found_inactive_medium_star = -1; |
Noximilien | 11:cf2ba52e8b7e | 246 | for (int i = 0; i < MAX_MEDIUM_STARS; ++i) { |
Noximilien | 11:cf2ba52e8b7e | 247 | if (!medium_stars[i].isMediumStarActive()) { |
Noximilien | 11:cf2ba52e8b7e | 248 | found_inactive_medium_star = i; |
Noximilien | 11:cf2ba52e8b7e | 249 | break; |
Noximilien | 11:cf2ba52e8b7e | 250 | } |
Noximilien | 11:cf2ba52e8b7e | 251 | } |
Noximilien | 11:cf2ba52e8b7e | 252 | |
Noximilien | 11:cf2ba52e8b7e | 253 | if (found_inactive_medium_star != -1) { |
Noximilien | 12:bfe3a3deaac3 | 254 | medium_stars[found_inactive_medium_star].mediumStarActivate(screen_width, rand() % screen_height); /////////////////////////////////////////// CHANGE |
Noximilien | 11:cf2ba52e8b7e | 255 | } |
Noximilien | 11:cf2ba52e8b7e | 256 | } |
Noximilien | 11:cf2ba52e8b7e | 257 | |
Noximilien | 11:cf2ba52e8b7e | 258 | void Game::updateAndDrawMediumStars(){ |
Noximilien | 11:cf2ba52e8b7e | 259 | for (int i = 0; i < MAX_MEDIUM_STARS; ++i) { |
Noximilien | 11:cf2ba52e8b7e | 260 | if (medium_stars[i].isMediumStarActive()) { |
Noximilien | 11:cf2ba52e8b7e | 261 | medium_stars[i].updateAndDrawMediumStar(); |
Noximilien | 11:cf2ba52e8b7e | 262 | } |
Noximilien | 11:cf2ba52e8b7e | 263 | } |
Noximilien | 11:cf2ba52e8b7e | 264 | } |