Updated Space Invaders on the mbed. Improved upon Michael Son's "Mbed Space Invaders" at https://os.mbed.com/users/michaeljson/notebook/mbed-space-invaders/.

Dependencies:   mbed wave_player mbed-rtos 4DGL-uLCD-SE SparkfunAnalogJoystick SDFileSystem LSM9DS1_Library_cal_updated

Fork of Two-PlayerSpaceInvaders by William Minix

test

Committer:
wminix3
Date:
Wed Apr 28 15:21:44 2021 +0000
Revision:
28:a2dac56af32f
Parent:
26:3270c6edd7d9
Added and cleaned up the comments.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wminix3 23:56f6a12aaebd 1 #include "barrier.h"
wminix3 23:56f6a12aaebd 2 #include "missile.h"
wminix3 23:56f6a12aaebd 3 #include "globals.h"
wminix3 23:56f6a12aaebd 4 /*
wminix3 23:56f6a12aaebd 5 #define GREEN 0x00FF00
wminix3 23:56f6a12aaebd 6
wminix3 23:56f6a12aaebd 7 // Modified from the RPG Game from ECE 2035. Draw more complex player object (with changing color).
wminix3 23:56f6a12aaebd 8 void draw_img(int u, int v, int width, int height, const char* img)
wminix3 23:56f6a12aaebd 9 {
wminix3 23:56f6a12aaebd 10 int colors[width*height];
wminix3 23:56f6a12aaebd 11 for (int i = 0; i < width*height; i++)
wminix3 23:56f6a12aaebd 12 {
wminix3 23:56f6a12aaebd 13 if (img[i] == 'G') colors[i] = GREEN;
wminix3 23:56f6a12aaebd 14 //else if (img[i] == 'B') colors[i] = BLUE;
wminix3 23:56f6a12aaebd 15 //else if (img[i] == 'P') colors[i] = PINK;
wminix3 23:56f6a12aaebd 16 //else if (img[i] == 'U') colors[i] = PURPLE;
wminix3 23:56f6a12aaebd 17 //else if (img[i] == 'Y') colors[i] = YELLOW;
wminix3 23:56f6a12aaebd 18 //else if (img[i] == 'R') colors[i] = RED;
wminix3 23:56f6a12aaebd 19 else colors[i] = BLACK;
wminix3 23:56f6a12aaebd 20 }
wminix3 23:56f6a12aaebd 21 uLCD.BLIT(u, v, width, height, colors);
wminix3 23:56f6a12aaebd 22 wait_us(250); // Recovery time!
wminix3 23:56f6a12aaebd 23 }
wminix3 23:56f6a12aaebd 24 */
wminix3 23:56f6a12aaebd 25
wminix3 28:a2dac56af32f 26 // draw barrier on uLCD and set the boolean array to keep track of non-destroyed pixels
wminix3 23:56f6a12aaebd 27 void draw_barrier_object(int blk_x, int blk_y, int barrier_color, int barrier_width, int barrier_height, barrier_t *g)
wminix3 23:56f6a12aaebd 28 {
wminix3 23:56f6a12aaebd 29 char* colors;
wminix3 23:56f6a12aaebd 30 //uLCD.filled_rectangle(blk_x,blk_y,blk_x+p_width,blk_y+p_height,player_color);
wminix3 23:56f6a12aaebd 31 if (barrier_color == GREEN) {
wminix3 23:56f6a12aaebd 32 colors = "000000GGGGGGGG00000000000GGGGGGGGGG000000000GGGGGGGGGGGG0000000GGGGGGGGGGGGGG00000GGGGGGGGGGGGGGGG000GGGGGGGGGGGGGGGGGG0GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG00000000GGGGGGGGGGG0000000000GGGGGGGGG000000000000GGGGGGGG000000000000GGGGGGGG000000000000GGGG";
wminix3 23:56f6a12aaebd 33 }
wminix3 23:56f6a12aaebd 34
wminix3 23:56f6a12aaebd 35 /* 000000GGGGGGGG000000
wminix3 23:56f6a12aaebd 36 00000GGGGGGGGGG00000
wminix3 23:56f6a12aaebd 37 0000GGGGGGGGGGGG0000
wminix3 23:56f6a12aaebd 38 000GGGGGGGGGGGGGG000
wminix3 23:56f6a12aaebd 39 00GGGGGGGGGGGGGGGG00
wminix3 23:56f6a12aaebd 40 0GGGGGGGGGGGGGGGGGG0
wminix3 23:56f6a12aaebd 41 GGGGGGGGGGGGGGGGGGGG
wminix3 23:56f6a12aaebd 42 GGGGGGGGGGGGGGGGGGGG
wminix3 23:56f6a12aaebd 43 GGGGGGGGGGGGGGGGGGGG
wminix3 23:56f6a12aaebd 44 GGGGGGGGGGGGGGGGGGGG
wminix3 23:56f6a12aaebd 45 GGGGGGGGGGGGGGGGGGGG
wminix3 23:56f6a12aaebd 46 GGGGGGGGGGGGGGGGGGGG
wminix3 23:56f6a12aaebd 47 GGGGGGGGGGGGGGGGGGGG
wminix3 23:56f6a12aaebd 48 GGGGGGGGGGGGGGGGGGGG
wminix3 23:56f6a12aaebd 49 GGGGGGGGGGGGGGGGGGGG
wminix3 23:56f6a12aaebd 50 GGGGGG00000000GGGGGG
wminix3 23:56f6a12aaebd 51 GGGGG0000000000GGGGG
wminix3 23:56f6a12aaebd 52 GGGG000000000000GGGG
wminix3 23:56f6a12aaebd 53 GGGG000000000000GGGG
wminix3 23:56f6a12aaebd 54 GGGG000000000000GGGG */
wminix3 28:a2dac56af32f 55 // This initializes the boolean array of pixels to be 1 when the pixel is green and 0 when the pixel is black. Keep track of destroyed pixels.
wminix3 23:56f6a12aaebd 56 for (int x = 0; x < 20; x++) {
wminix3 23:56f6a12aaebd 57 for (int y = 0; y < 20; y++) {
wminix3 23:56f6a12aaebd 58 g->barrierPixels[y*20 + x] = (colors[y*20 + x] == 'G');
wminix3 23:56f6a12aaebd 59 }
wminix3 23:56f6a12aaebd 60 }
wminix3 23:56f6a12aaebd 61 draw_img(blk_x, blk_y, barrier_width, barrier_height, colors); // draw the barrier
wminix3 23:56f6a12aaebd 62 }
wminix3 23:56f6a12aaebd 63
wminix3 23:56f6a12aaebd 64 void erase_barrier(int blk_x, int blk_y, int barrier_width, int barrier_height)
wminix3 23:56f6a12aaebd 65 {
wminix3 23:56f6a12aaebd 66 uLCD.filled_rectangle(blk_x,blk_y,blk_x+barrier_width,blk_y+barrier_height,BACKGROUND_COLOR);
wminix3 26:3270c6edd7d9 67
wminix3 23:56f6a12aaebd 68 }
wminix3 28:a2dac56af32f 69 // initialize a barrier with height and width 20, color green, and 0s in the boolean array
wminix3 23:56f6a12aaebd 70 void barrier_init(barrier_t * g, int blk_x, int blk_y, int color)
wminix3 23:56f6a12aaebd 71 {
wminix3 23:56f6a12aaebd 72 g->barrier_blk_x = blk_x;
wminix3 23:56f6a12aaebd 73 g->barrier_blk_y = blk_y;
wminix3 23:56f6a12aaebd 74 g->barrier_color = 0x00FF00;
wminix3 23:56f6a12aaebd 75 //g->player_height = 8;
wminix3 23:56f6a12aaebd 76 //g->player_width = 8;
wminix3 23:56f6a12aaebd 77 g->barrier_height = 20;
wminix3 23:56f6a12aaebd 78 g->barrier_width = 20;
wminix3 23:56f6a12aaebd 79 memset(g->barrierPixels, 0, sizeof(bool) * 20 * 20);
wminix3 23:56f6a12aaebd 80 //g->status = PLAYER_ALIVE;
wminix3 23:56f6a12aaebd 81 }
wminix3 23:56f6a12aaebd 82
wminix3 23:56f6a12aaebd 83 void barrier_show(barrier_t * g)
wminix3 23:56f6a12aaebd 84 {
wminix3 23:56f6a12aaebd 85 draw_barrier_object(g->barrier_blk_x, g->barrier_blk_y, g->barrier_color, g->barrier_width, g->barrier_height, g);
wminix3 23:56f6a12aaebd 86 }
wminix3 23:56f6a12aaebd 87
wminix3 28:a2dac56af32f 88 // erase the barrier and set the boolean array to 0 so that missiles can go through this area.
wminix3 23:56f6a12aaebd 89 void barrier_erase(barrier_t *g)
wminix3 23:56f6a12aaebd 90 {
wminix3 23:56f6a12aaebd 91 erase_barrier(g->barrier_blk_x, g->barrier_blk_y, g->barrier_width, g->barrier_height);
wminix3 26:3270c6edd7d9 92 memset(g->barrierPixels, 0, sizeof(bool) * 20 * 20);
wminix3 23:56f6a12aaebd 93 }
wminix3 23:56f6a12aaebd 94
wminix3 28:a2dac56af32f 95 // check barrier for being hit by player or enemy missiles
wminix3 23:56f6a12aaebd 96 void check_barrier(barrier_t * g, missile_t * h)
wminix3 23:56f6a12aaebd 97 {
wminix3 23:56f6a12aaebd 98 //int barrier_died = 0;
wminix3 23:56f6a12aaebd 99 // handle the two possible types of missiles: player and enemy.
wminix3 23:56f6a12aaebd 100 if (h->status == ENEMY_MISSILE_ACTIVE) {
wminix3 23:56f6a12aaebd 101 if (((h->missile_blk_x >= g->barrier_blk_x) && (h->missile_blk_x <= (g->barrier_blk_x + g->barrier_width)))
wminix3 23:56f6a12aaebd 102 && ((h->missile_blk_y >= g->barrier_blk_y) && (h->missile_blk_y <= (g->barrier_blk_y + g->barrier_height)))
wminix3 23:56f6a12aaebd 103 && ((g->barrierPixels[h->missile_blk_x - g->barrier_blk_x + (h->missile_blk_y - g->barrier_blk_y)*20])))
wminix3 23:56f6a12aaebd 104 {
wminix3 23:56f6a12aaebd 105 //player_erase(g);
wminix3 23:56f6a12aaebd 106 // "destroy" the pixels surrounding the impact of the missile in a 11x6 rectangle. Set the colors of these pixels to black.
wminix3 23:56f6a12aaebd 107 for (int x = h->missile_blk_x - 5; ((x <= h->missile_blk_x + 5) && (x <= g->barrier_blk_x + g->barrier_width)); x++) {
wminix3 23:56f6a12aaebd 108 for (int y = h->missile_blk_y; ((y <= h->missile_blk_y + 5) && (y <= g->barrier_blk_y + g->barrier_height)); y++) {
wminix3 23:56f6a12aaebd 109 if (x >= g->barrier_blk_x) {
wminix3 23:56f6a12aaebd 110 g->barrierPixels[x - g->barrier_blk_x + (y - g->barrier_blk_y)*20] = 0;
wminix3 23:56f6a12aaebd 111 uLCD.pixel(x, y, BLACK);
wminix3 23:56f6a12aaebd 112 }
wminix3 23:56f6a12aaebd 113 }
wminix3 23:56f6a12aaebd 114 }
wminix3 23:56f6a12aaebd 115 h->status = ENEMY_MISSILE_EXPLODED;
wminix3 23:56f6a12aaebd 116 }
wminix3 23:56f6a12aaebd 117 } else {
wminix3 23:56f6a12aaebd 118 //printf("%d\n\r", h->missile_blk_y - h->missile_height <= g->barrier_blk_y);
wminix3 23:56f6a12aaebd 119 //uLCD.filled_rectangle(h->missile_blk_x, h->missile_blk_y - h->missile_height, h->missile_blk_x+1, h->missile_blk_y - h->missile_height + 2, RED);
wminix3 23:56f6a12aaebd 120 //uLCD.filled_rectangle(g->barrier_blk_x, g->barrier_blk_y, g->barrier_blk_x + 1, g->barrier_blk_y + 2, RED);
wminix3 23:56f6a12aaebd 121 //while(1) {
wminix3 23:56f6a12aaebd 122 // printf("%d\n\r", h->missile_blk_y - h->missile_height >= g->barrier_blk_y);
wminix3 23:56f6a12aaebd 123 //};
wminix3 23:56f6a12aaebd 124 //printf("%d\n\r", h->missile_blk_y - h->missile_height);
wminix3 23:56f6a12aaebd 125 //printf("%d\n\r", h->missile_blk_y);
wminix3 23:56f6a12aaebd 126 //printf("%d\n\r", g->barrier_blk_y);
wminix3 23:56f6a12aaebd 127 if (((h->missile_blk_x >= g->barrier_blk_x) && (h->missile_blk_x <= (g->barrier_blk_x + g->barrier_width)))
wminix3 23:56f6a12aaebd 128 && ((h->missile_blk_y - h->missile_height <= g->barrier_blk_y + g->barrier_height) && (h->missile_blk_y - h->missile_height >= g->barrier_blk_y))
wminix3 23:56f6a12aaebd 129 && ((g->barrierPixels[h->missile_blk_x - g->barrier_blk_x + (h->missile_blk_y - h->missile_height - g->barrier_blk_y)*20])))
wminix3 23:56f6a12aaebd 130 {
wminix3 23:56f6a12aaebd 131 //player_erase(g);
wminix3 23:56f6a12aaebd 132 // "destroy" the pixels surrounding the impact of the missile in a 11x6 rectangle. Set the colors of these pixels to black.
wminix3 23:56f6a12aaebd 133 //printf("%d", h->missile_blk_y - h->missile_height <= g->barrier_blk_y + g->barrier_height);
wminix3 23:56f6a12aaebd 134 h->status = PLAYER_MISSILE_EXPLODED;
wminix3 23:56f6a12aaebd 135 for (int x = h->missile_blk_x - 5; ((x <= h->missile_blk_x + 5) && (x <= g->barrier_blk_x + g->barrier_width)); x++) {
wminix3 23:56f6a12aaebd 136 for (int y = h->missile_blk_y - h->missile_height; ((y >= h->missile_blk_y - h->missile_height - 5) && (y >= g->barrier_blk_y)); y--) {
wminix3 23:56f6a12aaebd 137 if (x >= g->barrier_blk_x) {
wminix3 23:56f6a12aaebd 138 g->barrierPixels[x - g->barrier_blk_x + (y - g->barrier_blk_y)*20] = 0;
wminix3 23:56f6a12aaebd 139 uLCD.pixel(x, y, BLACK);
wminix3 23:56f6a12aaebd 140 }
wminix3 23:56f6a12aaebd 141 }
wminix3 23:56f6a12aaebd 142 }
wminix3 23:56f6a12aaebd 143 }
wminix3 23:56f6a12aaebd 144 }
wminix3 23:56f6a12aaebd 145 }