Space Invaders - Embedded Systems Project 15/16 - Avinash Patel 200860407

Dependencies:   Joystick N5110 SDFileSystem mbed

Revision:
4:a99953ef9e42
Parent:
3:544b59d60ab8
Child:
5:34855f712350
--- a/main.cpp	Sun Mar 27 18:47:07 2016 +0000
+++ b/main.cpp	Thu Mar 31 16:03:26 2016 +0000
@@ -14,6 +14,7 @@
 #define RIGHT 1
 
 //Preprocessor for screen map
+/*
 #define EMPTY 0
 #define CANNON 1
 #define SMALL 2
@@ -22,6 +23,7 @@
 #define BARRIER 5
 #define UFO 6
 #define CANNON_SHOT 7
+*/
 
 //Joystick Class
 class Joystick
@@ -153,7 +155,15 @@
 Ticker update_screen;
 
 //Map holding pixel data of screen
-short screen_map[84][48];
+int screen_map[84][48];
+const int empty_pixel = 0;
+const int cannon_pixel = 1;
+const int first_barrier_pixel = 2;
+const int first_large_invader_pixel = 5;
+const int first_medium_invader_pixel = 10;
+const int first_small_invader_pixel = 15;
+const int ufo_pixel = 20;
+const int cannon_shot_pixel = 21;
 
 //Ship bit-map and location
 int cannon_xpos = 24;
@@ -331,7 +341,7 @@
 
     update_screen.attach(&update_screen_isr, 0.05);
     move_cannon.attach(&move_cannon_isr, 0.05);
-    move_enemies.attach(&move_enemies_isr, 1);
+    move_enemies.attach(&move_enemies_isr, 0.5);
 
     InitSmallInvaders();
     InitMediumInvaders();
@@ -385,7 +395,7 @@
                     //Add 4 to cannon x_pos to get shot x_pos
                     cannon_shot_x_pos = cannon_xpos + 4;
                     cannon_shot_y_pos = 40;
-                    move_cannon_shot.attach(&move_cannon_shot_isr, 0.1);
+                    move_cannon_shot.attach(&move_cannon_shot_isr, 0.05);
                 }
             }
             //Move the cannon's shot
@@ -397,7 +407,7 @@
                     //Loops throught the shot bitmap and clears the pixels in the screen map
                     for (int row = 0; row < 3; row++) {
                         //Clears the position where the bullet was
-                        screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = EMPTY;
+                        screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = empty_pixel;
                     }
 
                     //Increments the shot going up the screen
@@ -405,41 +415,49 @@
 
                     //Checks to see what the shot hits. If it hits nothing the shot gets pushed to the screen map
                     for (int row = 0; row < 3; row++) {
-                        if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] == SMALL)
+                        int object_no;
+                        if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] >= first_small_invader_pixel && screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] < (first_small_invader_pixel + 5))
                         {
-                            pc.printf("Small Hit\n");
-                            cannon_shot_on_screen = false;
-                            move_cannon_shot.detach();
-                            break;
-                        } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] == MEDIUM) {
-                            pc.printf("Medium Hit\n");
+                            object_no = screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] - first_small_invader_pixel;
+                            small_invader[object_no].is_alive = false;
+                            pc.printf("Small (%d) Hit\n", object_no);
                             cannon_shot_on_screen = false;
                             move_cannon_shot.detach();
                             break;
-                        } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] == LARGE) {
-                            pc.printf("Large Hit\n");
+                        } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] >= first_medium_invader_pixel && screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] < (first_medium_invader_pixel + 5)) {
+                            object_no = screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] - first_medium_invader_pixel;
+                            medium_invader[object_no].is_alive = false;
+                            pc.printf("Medium (%d) Hit\n", object_no);
                             cannon_shot_on_screen = false;
                             move_cannon_shot.detach();
                             break;
-                        } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] == BARRIER) {
-                            pc.printf("Barrier Hit\n");
+                        } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] >= first_large_invader_pixel && screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] < (first_large_invader_pixel + 5)) {
+                            object_no = screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] - first_large_invader_pixel;
+                            large_invader[object_no].is_alive = false;
+                            pc.printf("Large (%d) Hit\n", object_no);
                             cannon_shot_on_screen = false;
                             move_cannon_shot.detach();
                             break;
-                        } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] == UFO) {
+                        } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] >= first_barrier_pixel && screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] < (first_barrier_pixel + 3)) {
+                            object_no = screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] - first_barrier_pixel;   
+                            pc.printf("Barrier (%d) Hit\n", object_no);
+                            cannon_shot_on_screen = false;
+                            move_cannon_shot.detach();
+                            break;
+                        } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] == ufo_pixel) {
                             pc.printf("UFO Hit\n");
                             cannon_shot_on_screen = false;
                             move_cannon_shot.detach();
                             break;
                         } else {
-                            screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = CANNON_SHOT;
+                            screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = cannon_shot_pixel;
                         }
                     }  
                 } else {
                     //Loops throught the shot bitmap and clears the pixels in the screen map
                     for (int row = 1; row < 3; row++) {
                         //Clears the position where the bullet was
-                        screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = EMPTY;
+                        screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = empty_pixel;
                     }
                     cannon_shot_on_screen = false;
                 }
@@ -478,10 +496,11 @@
 
             ShiftInvaderXPositions();
 
+
             DrawSmallInvaders();
             DrawMediumInvaders();
             DrawLargeInvaders();
-            DrawUFO();
+            //DrawUFO();
 
             invaders_in_state2 = !invaders_in_state2;
 
@@ -560,7 +579,7 @@
         for (int row = 0; row < 5; row++) {
             if(cannon_bitmap[row][col]) {
                 //lcd.clearPixel(cannon_xpos+col, cannon_ypos+row);
-                screen_map[cannon_xpos+col][cannon_ypos+row] = EMPTY;
+                screen_map[cannon_xpos+col][cannon_ypos+row] = empty_pixel;
             }
         }
     }
@@ -583,7 +602,7 @@
         for (int row = 0; row < 5; row++) {
             if(cannon_bitmap[row][col]) {
                 //lcd.setPixel(cannon_xpos+col, cannon_ypos+row);
-                screen_map[cannon_xpos+col][cannon_ypos+row] = CANNON;
+                screen_map[cannon_xpos+col][cannon_ypos+row] = cannon_pixel;
             }
         }
     }
@@ -610,18 +629,18 @@
         if (!invaders_in_state2) {
             for (int col = 0; col < 8; col++) {
                 for (int row = 0; row < 6; row++) {
-                    if(small_invader_bitmap_1[row][col]) {
+                    if(small_invader_bitmap_1[row][col] && small_invader[i].x_pos + col >= 0 && small_invader[i].x_pos + col < 84) {
                         //lcd.clearPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
-                        screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = EMPTY;
+                        screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = empty_pixel;
                     }
                 }
             }
         } else {
             for (int col = 0; col < 8; col++) {
                 for (int row = 0; row < 6; row++) {
-                    if(small_invader_bitmap_2[row][col]) {
+                    if(small_invader_bitmap_2[row][col] && small_invader[i].x_pos + col >= 0 && small_invader[i].x_pos + col < 84) {
                         //lcd.clearPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
-                        screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = EMPTY;
+                        screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = empty_pixel;
                     }
                 }
             }
@@ -641,7 +660,7 @@
                     for (int row = 0; row < 6; row++) {
                         if(small_invader_bitmap_1[row][col]) {
                             //lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
-                            screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = SMALL;
+                            screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = first_small_invader_pixel + i;
                         }
                     }
                 }
@@ -650,7 +669,7 @@
                     for (int row = 0; row < 6; row++) {
                         if(small_invader_bitmap_2[row][col]) {
                             //lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
-                            screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = SMALL;
+                            screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = first_small_invader_pixel + i;
                         }
                     }
                 }
@@ -675,18 +694,18 @@
         if (!invaders_in_state2) {
             for (int col = 0; col < 10; col++) {
                 for (int row = 0; row < 6; row++) {
-                    if(medium_invader_bitmap_1[row][col]) {
+                    if(medium_invader_bitmap_1[row][col] && medium_invader[i].x_pos + col >= 0 && medium_invader[i].x_pos + col < 84) {
                         //lcd.clearPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
-                        screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = EMPTY;
+                        screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = empty_pixel;
                     }
                 }
             }
         } else {
             for (int col = 0; col < 10; col++) {
                 for (int row = 0; row < 6; row++) {
-                    if(medium_invader_bitmap_2[row][col]) {
+                    if(medium_invader_bitmap_2[row][col] && medium_invader[i].x_pos + col >= 0 && medium_invader[i].x_pos + col < 84) {
                         //lcd.clearPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
-                        screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = EMPTY;
+                        screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = empty_pixel;
                     }
                 }
             }
@@ -706,7 +725,7 @@
                     for (int row = 0; row < 6; row++) {
                         if(medium_invader_bitmap_1[row][col]) {
                             //lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
-                            screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = MEDIUM;
+                            screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = first_medium_invader_pixel + i;
                         }
                     }
                 }
@@ -715,7 +734,7 @@
                     for (int row = 0; row < 6; row++) {
                         if(medium_invader_bitmap_2[row][col]) {
                             //lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
-                            screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = MEDIUM;
+                            screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = first_medium_invader_pixel + i;
                         }
                     }
                 }
@@ -741,18 +760,18 @@
         if (!invaders_in_state2) {
             for (int col = 0; col < 12; col++) {
                 for (int row = 0; row < 6; row++) {
-                    if(large_invader_bitmap_1[row][col]) {
+                    if(large_invader_bitmap_1[row][col] && large_invader[i].x_pos + col >= 0 && large_invader[i].x_pos + col < 84) {
                         ///lcd.clearPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
-                        screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = EMPTY;
+                        screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = empty_pixel;
                     }
                 }
             }
         } else {
             for (int col = 0; col < 12; col++) {
                 for (int row = 0; row < 6; row++) {
-                    if(large_invader_bitmap_2[row][col]) {
+                    if(large_invader_bitmap_2[row][col] && large_invader[i].x_pos + col >= 0 && large_invader[i].x_pos + col < 84) {
                         //lcd.clearPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
-                        screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = EMPTY;
+                        screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = empty_pixel;
                     }
                 }
             }
@@ -772,7 +791,7 @@
                     for (int row = 0; row < 6; row++) {
                         if(large_invader_bitmap_1[row][col]) {
                             //lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
-                            screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = LARGE;
+                            screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = first_large_invader_pixel + i;
                         }
                     }
                 }
@@ -781,7 +800,7 @@
                     for (int row = 0; row < 6; row++) {
                         if(large_invader_bitmap_2[row][col]) {
                             //lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
-                            screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = LARGE;
+                            screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = first_large_invader_pixel + i;
                         }
                     }
                 }
@@ -845,11 +864,11 @@
             for (int row = 0; row < 8; row++) {
                 if (barrier[i].before_bitmap[row][col]) {
                     //lcd.clearPixel(barrier[i].x_pos + col, barrier[i].y_pos + row);
-                    screen_map[barrier[i].x_pos + col][barrier[i].y_pos + row] = EMPTY;
+                    screen_map[barrier[i].x_pos + col][barrier[i].y_pos + row] = empty_pixel;
                 }
                 if (barrier[i].after_bitmap[row][col]) {
                     //lcd.setPixel(barrier[i].x_pos + col, barrier[i].y_pos + row);
-                    screen_map[barrier[i].x_pos + col][barrier[i].y_pos + row] = BARRIER;
+                    screen_map[barrier[i].x_pos + col][barrier[i].y_pos + row] = first_barrier_pixel + i;
                 }
             }
         }
@@ -927,7 +946,7 @@
         for (int row = 0; row < row_no; row++) {
             if(ufo_bitmap[row][col]) {
                 //lcd.setPixel(x_pos + col, y_pos + row);
-                screen_map[x_pos + col][y_pos + row] = UFO;
+                screen_map[x_pos + col][y_pos + row] = ufo_pixel;
             }
         }
     }