Space Invaders - Embedded Systems Project 15/16 - Avinash Patel 200860407
Dependencies: Joystick N5110 SDFileSystem mbed
Diff: main.cpp
- 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; } } }