ELEC2645 (2018/19) / Mbed 2 deprecated el17dg

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

Committer:
Noximilien
Date:
Mon Mar 18 15:22:20 2019 +0000
Revision:
15:0145c5f0bea1
Parent:
14:e8de27c4d0d4
Child:
16:b7d0cac561cc
Have created new limit borders to suit the score line. Have created intro sprites for my intro. Need to fix the problem where enemy ship is generated beyond screen.

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