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:
Mon Apr 26 21:53:25 2021 +0000
Revision:
23:56f6a12aaebd
Child:
26:3270c6edd7d9
Added barriers that both enemies and the player can damage. More true to original space invaders.

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 23:56f6a12aaebd 26 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 27 {
wminix3 23:56f6a12aaebd 28 char* colors;
wminix3 23:56f6a12aaebd 29 //uLCD.filled_rectangle(blk_x,blk_y,blk_x+p_width,blk_y+p_height,player_color);
wminix3 23:56f6a12aaebd 30 if (barrier_color == GREEN) {
wminix3 23:56f6a12aaebd 31 colors = "000000GGGGGGGG00000000000GGGGGGGGGG000000000GGGGGGGGGGGG0000000GGGGGGGGGGGGGG00000GGGGGGGGGGGGGGGG000GGGGGGGGGGGGGGGGGG0GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG00000000GGGGGGGGGGG0000000000GGGGGGGGG000000000000GGGGGGGG000000000000GGGGGGGG000000000000GGGG";
wminix3 23:56f6a12aaebd 32 }
wminix3 23:56f6a12aaebd 33
wminix3 23:56f6a12aaebd 34 /* 000000GGGGGGGG000000
wminix3 23:56f6a12aaebd 35 00000GGGGGGGGGG00000
wminix3 23:56f6a12aaebd 36 0000GGGGGGGGGGGG0000
wminix3 23:56f6a12aaebd 37 000GGGGGGGGGGGGGG000
wminix3 23:56f6a12aaebd 38 00GGGGGGGGGGGGGGGG00
wminix3 23:56f6a12aaebd 39 0GGGGGGGGGGGGGGGGGG0
wminix3 23:56f6a12aaebd 40 GGGGGGGGGGGGGGGGGGGG
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 GGGGGG00000000GGGGGG
wminix3 23:56f6a12aaebd 50 GGGGG0000000000GGGGG
wminix3 23:56f6a12aaebd 51 GGGG000000000000GGGG
wminix3 23:56f6a12aaebd 52 GGGG000000000000GGGG
wminix3 23:56f6a12aaebd 53 GGGG000000000000GGGG */
wminix3 23:56f6a12aaebd 54 // This initializes the boolean array of pixels to be 1 when the pixel is green and 0 when the pixel is black.
wminix3 23:56f6a12aaebd 55 for (int x = 0; x < 20; x++) {
wminix3 23:56f6a12aaebd 56 for (int y = 0; y < 20; y++) {
wminix3 23:56f6a12aaebd 57 g->barrierPixels[y*20 + x] = (colors[y*20 + x] == 'G');
wminix3 23:56f6a12aaebd 58 }
wminix3 23:56f6a12aaebd 59 }
wminix3 23:56f6a12aaebd 60 draw_img(blk_x, blk_y, barrier_width, barrier_height, colors); // draw the barrier
wminix3 23:56f6a12aaebd 61 }
wminix3 23:56f6a12aaebd 62
wminix3 23:56f6a12aaebd 63 void erase_barrier(int blk_x, int blk_y, int barrier_width, int barrier_height)
wminix3 23:56f6a12aaebd 64 {
wminix3 23:56f6a12aaebd 65 uLCD.filled_rectangle(blk_x,blk_y,blk_x+barrier_width,blk_y+barrier_height,BACKGROUND_COLOR);
wminix3 23:56f6a12aaebd 66 }
wminix3 23:56f6a12aaebd 67
wminix3 23:56f6a12aaebd 68 void barrier_init(barrier_t * g, int blk_x, int blk_y, int color)
wminix3 23:56f6a12aaebd 69 {
wminix3 23:56f6a12aaebd 70 g->barrier_blk_x = blk_x;
wminix3 23:56f6a12aaebd 71 g->barrier_blk_y = blk_y;
wminix3 23:56f6a12aaebd 72 g->barrier_color = 0x00FF00;
wminix3 23:56f6a12aaebd 73 //g->player_height = 8;
wminix3 23:56f6a12aaebd 74 //g->player_width = 8;
wminix3 23:56f6a12aaebd 75 g->barrier_height = 20;
wminix3 23:56f6a12aaebd 76 g->barrier_width = 20;
wminix3 23:56f6a12aaebd 77 memset(g->barrierPixels, 0, sizeof(bool) * 20 * 20);
wminix3 23:56f6a12aaebd 78 //g->status = PLAYER_ALIVE;
wminix3 23:56f6a12aaebd 79 }
wminix3 23:56f6a12aaebd 80
wminix3 23:56f6a12aaebd 81 void barrier_show(barrier_t * g)
wminix3 23:56f6a12aaebd 82 {
wminix3 23:56f6a12aaebd 83 draw_barrier_object(g->barrier_blk_x, g->barrier_blk_y, g->barrier_color, g->barrier_width, g->barrier_height, g);
wminix3 23:56f6a12aaebd 84 }
wminix3 23:56f6a12aaebd 85
wminix3 23:56f6a12aaebd 86 void barrier_erase(barrier_t *g)
wminix3 23:56f6a12aaebd 87 {
wminix3 23:56f6a12aaebd 88 erase_barrier(g->barrier_blk_x, g->barrier_blk_y, g->barrier_width, g->barrier_height);
wminix3 23:56f6a12aaebd 89 }
wminix3 23:56f6a12aaebd 90
wminix3 23:56f6a12aaebd 91 void check_barrier(barrier_t * g, missile_t * h)
wminix3 23:56f6a12aaebd 92 {
wminix3 23:56f6a12aaebd 93 //int barrier_died = 0;
wminix3 23:56f6a12aaebd 94 // handle the two possible types of missiles: player and enemy.
wminix3 23:56f6a12aaebd 95 if (h->status == ENEMY_MISSILE_ACTIVE) {
wminix3 23:56f6a12aaebd 96 if (((h->missile_blk_x >= g->barrier_blk_x) && (h->missile_blk_x <= (g->barrier_blk_x + g->barrier_width)))
wminix3 23:56f6a12aaebd 97 && ((h->missile_blk_y >= g->barrier_blk_y) && (h->missile_blk_y <= (g->barrier_blk_y + g->barrier_height)))
wminix3 23:56f6a12aaebd 98 && ((g->barrierPixels[h->missile_blk_x - g->barrier_blk_x + (h->missile_blk_y - g->barrier_blk_y)*20])))
wminix3 23:56f6a12aaebd 99 {
wminix3 23:56f6a12aaebd 100 //player_erase(g);
wminix3 23:56f6a12aaebd 101 // "destroy" the pixels surrounding the impact of the missile in a 11x6 rectangle. Set the colors of these pixels to black.
wminix3 23:56f6a12aaebd 102 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 103 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 104 if (x >= g->barrier_blk_x) {
wminix3 23:56f6a12aaebd 105 g->barrierPixels[x - g->barrier_blk_x + (y - g->barrier_blk_y)*20] = 0;
wminix3 23:56f6a12aaebd 106 uLCD.pixel(x, y, BLACK);
wminix3 23:56f6a12aaebd 107 }
wminix3 23:56f6a12aaebd 108 }
wminix3 23:56f6a12aaebd 109 }
wminix3 23:56f6a12aaebd 110 h->status = ENEMY_MISSILE_EXPLODED;
wminix3 23:56f6a12aaebd 111 }
wminix3 23:56f6a12aaebd 112 } else {
wminix3 23:56f6a12aaebd 113 //printf("%d\n\r", h->missile_blk_y - h->missile_height <= g->barrier_blk_y);
wminix3 23:56f6a12aaebd 114 //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 115 //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 116 //while(1) {
wminix3 23:56f6a12aaebd 117 // printf("%d\n\r", h->missile_blk_y - h->missile_height >= g->barrier_blk_y);
wminix3 23:56f6a12aaebd 118 //};
wminix3 23:56f6a12aaebd 119 //printf("%d\n\r", h->missile_blk_y - h->missile_height);
wminix3 23:56f6a12aaebd 120 //printf("%d\n\r", h->missile_blk_y);
wminix3 23:56f6a12aaebd 121 //printf("%d\n\r", g->barrier_blk_y);
wminix3 23:56f6a12aaebd 122 if (((h->missile_blk_x >= g->barrier_blk_x) && (h->missile_blk_x <= (g->barrier_blk_x + g->barrier_width)))
wminix3 23:56f6a12aaebd 123 && ((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 124 && ((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 125 {
wminix3 23:56f6a12aaebd 126 //player_erase(g);
wminix3 23:56f6a12aaebd 127 // "destroy" the pixels surrounding the impact of the missile in a 11x6 rectangle. Set the colors of these pixels to black.
wminix3 23:56f6a12aaebd 128 //printf("%d", h->missile_blk_y - h->missile_height <= g->barrier_blk_y + g->barrier_height);
wminix3 23:56f6a12aaebd 129 h->status = PLAYER_MISSILE_EXPLODED;
wminix3 23:56f6a12aaebd 130 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 131 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 132 if (x >= g->barrier_blk_x) {
wminix3 23:56f6a12aaebd 133 g->barrierPixels[x - g->barrier_blk_x + (y - g->barrier_blk_y)*20] = 0;
wminix3 23:56f6a12aaebd 134 uLCD.pixel(x, y, BLACK);
wminix3 23:56f6a12aaebd 135 }
wminix3 23:56f6a12aaebd 136 }
wminix3 23:56f6a12aaebd 137 }
wminix3 23:56f6a12aaebd 138 }
wminix3 23:56f6a12aaebd 139 }
wminix3 23:56f6a12aaebd 140 //g->status = PLAYER_DEAD;
wminix3 23:56f6a12aaebd 141 //player_died = 1;
wminix3 23:56f6a12aaebd 142 // make sure to take into account both player and enemy missile types...
wminix3 23:56f6a12aaebd 143 //if (h->status == PLAYER_MISSILE_ACTIVE) {
wminix3 23:56f6a12aaebd 144 // h->status = PLAYER_MISSILE_EXPLODED; // missile explodes
wminix3 23:56f6a12aaebd 145 //} else {
wminix3 23:56f6a12aaebd 146 // h->status = ENEMY_MISSILE_EXPLODED; // missile explodes.
wminix3 23:56f6a12aaebd 147 //}
wminix3 23:56f6a12aaebd 148 //}
wminix3 23:56f6a12aaebd 149 //return player_died;
wminix3 23:56f6a12aaebd 150 }