Initial publish

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

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?

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 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 }