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
test
enemy.cpp@33:d17d71103d41, 2021-04-29 (annotated)
- Committer:
- wminix3
- Date:
- Thu Apr 29 05:41:40 2021 +0000
- Revision:
- 33:d17d71103d41
- Parent:
- 29:ff6b8a1ad9f5
Fixed score.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
michaeljson | 0:3817adfaeb06 | 1 | #include "enemy.h" |
michaeljson | 0:3817adfaeb06 | 2 | #include "missile.h" |
wminix3 | 29:ff6b8a1ad9f5 | 3 | #include "globals.h" |
michaeljson | 0:3817adfaeb06 | 4 | |
wminix3 | 29:ff6b8a1ad9f5 | 5 | // draws red enemy sprites instead of simple white squares |
michaeljson | 0:3817adfaeb06 | 6 | void draw_enemy(int blk_x, int blk_y, int enemy_color, int e_width, int e_height) |
michaeljson | 0:3817adfaeb06 | 7 | { |
wminix3 | 29:ff6b8a1ad9f5 | 8 | char *shapes; |
wminix3 | 29:ff6b8a1ad9f5 | 9 | //enemy_color = 0x00FF00; |
wminix3 | 29:ff6b8a1ad9f5 | 10 | if (enemy_color == 0xFF0000){ |
wminix3 | 29:ff6b8a1ad9f5 | 11 | shapes = "0000RRR00000RRRRRRRRR0RRRRRRRRRRRRRR00R00RRRRRRRRRRRRRR000RR0RR00000RR000RR00RR000R000RR"; |
wminix3 | 29:ff6b8a1ad9f5 | 12 | } |
wminix3 | 29:ff6b8a1ad9f5 | 13 | // uLCD.filled_rectangle(blk_x,blk_y,blk_x+e_width,blk_y-e_height,enemy_color); |
wminix3 | 29:ff6b8a1ad9f5 | 14 | //const int* colors = [ |
wminix3 | 29:ff6b8a1ad9f5 | 15 | //uLCD.BLIT(blk_x, blk_y, e_width, e_height, |
wminix3 | 29:ff6b8a1ad9f5 | 16 | |
wminix3 | 29:ff6b8a1ad9f5 | 17 | |
wminix3 | 29:ff6b8a1ad9f5 | 18 | draw_img(blk_x, blk_y, e_width, e_height, shapes); // use uLCD.BLIT |
wminix3 | 29:ff6b8a1ad9f5 | 19 | //uLCD.filled_rectangle(blk_x,blk_y,blk_x+e_width,blk_y-e_height,enemy_color); |
wminix3 | 16:e4e6515bdabb | 20 | //const int* colors = [ |
wminix3 | 16:e4e6515bdabb | 21 | //uLCD.BLIT(blk_x, blk_y, e_width, e_height, |
michaeljson | 0:3817adfaeb06 | 22 | } |
michaeljson | 0:3817adfaeb06 | 23 | |
michaeljson | 0:3817adfaeb06 | 24 | void erase_enemy(int blk_x, int blk_y, int enemy_color, int e_width, int e_height) |
michaeljson | 0:3817adfaeb06 | 25 | { |
wminix3 | 29:ff6b8a1ad9f5 | 26 | //uLCD.filled_rectangle(blk_x,blk_y,blk_x+e_width,blk_y-e_height,BACKGROUND_COLOR); |
wminix3 | 29:ff6b8a1ad9f5 | 27 | uLCD.filled_rectangle(blk_x - 2,blk_y,blk_x+11+2,blk_y+8+2,BACKGROUND_COLOR); // change the boundaries of the black rectangle to erase enemies better |
michaeljson | 0:3817adfaeb06 | 28 | } |
michaeljson | 0:3817adfaeb06 | 29 | |
michaeljson | 0:3817adfaeb06 | 30 | int move_enemy(enemy_t * g, int MOVE_DOWN, int DIRECTION) |
michaeljson | 0:3817adfaeb06 | 31 | { |
michaeljson | 0:3817adfaeb06 | 32 | if (g->status == ENEMY_ALIVE) |
michaeljson | 0:3817adfaeb06 | 33 | { |
michaeljson | 0:3817adfaeb06 | 34 | if (DIRECTION == 1) |
michaeljson | 0:3817adfaeb06 | 35 | { |
michaeljson | 0:3817adfaeb06 | 36 | enemy_erase(g); |
michaeljson | 0:3817adfaeb06 | 37 | g->enemy_blk_x += 1; |
michaeljson | 0:3817adfaeb06 | 38 | enemy_show(g); |
michaeljson | 0:3817adfaeb06 | 39 | |
michaeljson | 0:3817adfaeb06 | 40 | if (g->enemy_blk_y >= 110) |
michaeljson | 0:3817adfaeb06 | 41 | { |
michaeljson | 0:3817adfaeb06 | 42 | MOVE_DOWN = 2; |
michaeljson | 0:3817adfaeb06 | 43 | } |
michaeljson | 0:3817adfaeb06 | 44 | } |
michaeljson | 0:3817adfaeb06 | 45 | else if (DIRECTION == 2) |
michaeljson | 0:3817adfaeb06 | 46 | { |
michaeljson | 0:3817adfaeb06 | 47 | enemy_erase(g); |
michaeljson | 0:3817adfaeb06 | 48 | g->enemy_blk_x -= 1; |
michaeljson | 0:3817adfaeb06 | 49 | enemy_show(g); |
michaeljson | 0:3817adfaeb06 | 50 | |
michaeljson | 0:3817adfaeb06 | 51 | if (g->enemy_blk_y >= 110) |
michaeljson | 0:3817adfaeb06 | 52 | { |
michaeljson | 0:3817adfaeb06 | 53 | MOVE_DOWN = 2; |
michaeljson | 0:3817adfaeb06 | 54 | } |
michaeljson | 0:3817adfaeb06 | 55 | } |
michaeljson | 0:3817adfaeb06 | 56 | |
michaeljson | 0:3817adfaeb06 | 57 | if ((g->enemy_blk_x+g->enemy_width) > (128-g->enemy_width) |
michaeljson | 0:3817adfaeb06 | 58 | || (g->enemy_blk_x < (0+g->enemy_width))) |
michaeljson | 0:3817adfaeb06 | 59 | { |
michaeljson | 0:3817adfaeb06 | 60 | MOVE_DOWN = 1; |
michaeljson | 0:3817adfaeb06 | 61 | } |
michaeljson | 0:3817adfaeb06 | 62 | } |
michaeljson | 0:3817adfaeb06 | 63 | return MOVE_DOWN; |
michaeljson | 0:3817adfaeb06 | 64 | } |
michaeljson | 0:3817adfaeb06 | 65 | |
michaeljson | 0:3817adfaeb06 | 66 | void enemy_init(enemy_t * g, unsigned int blk_x, unsigned int blk_y, unsigned int color) |
michaeljson | 0:3817adfaeb06 | 67 | { |
michaeljson | 0:3817adfaeb06 | 68 | g->enemy_blk_x = blk_x; |
michaeljson | 0:3817adfaeb06 | 69 | g->enemy_blk_y = blk_y; |
michaeljson | 0:3817adfaeb06 | 70 | g->enemy_color = color; |
wminix3 | 29:ff6b8a1ad9f5 | 71 | g->enemy_width = 11; // make width of enemy 11 |
wminix3 | 29:ff6b8a1ad9f5 | 72 | g->enemy_height = 8; // make height of enemy 8 |
michaeljson | 0:3817adfaeb06 | 73 | g->status = ENEMY_ALIVE; |
michaeljson | 0:3817adfaeb06 | 74 | } |
michaeljson | 0:3817adfaeb06 | 75 | |
michaeljson | 0:3817adfaeb06 | 76 | void enemy_show(enemy_t * g) |
michaeljson | 0:3817adfaeb06 | 77 | { |
michaeljson | 0:3817adfaeb06 | 78 | draw_enemy(g->enemy_blk_x, g->enemy_blk_y, g->enemy_color, g->enemy_width, g->enemy_height); |
michaeljson | 0:3817adfaeb06 | 79 | } |
michaeljson | 0:3817adfaeb06 | 80 | |
michaeljson | 0:3817adfaeb06 | 81 | void enemy_erase(enemy_t * g) |
michaeljson | 0:3817adfaeb06 | 82 | { |
michaeljson | 0:3817adfaeb06 | 83 | erase_enemy(g->enemy_blk_x, g->enemy_blk_y, g->enemy_color, g->enemy_width, g->enemy_height); |
michaeljson | 0:3817adfaeb06 | 84 | } |
michaeljson | 0:3817adfaeb06 | 85 | |
michaeljson | 0:3817adfaeb06 | 86 | int check_enemy(enemy_t * g, missile_t * h) |
michaeljson | 0:3817adfaeb06 | 87 | { |
michaeljson | 0:3817adfaeb06 | 88 | int enemy_died = 0; |
michaeljson | 0:3817adfaeb06 | 89 | if (g->status == ENEMY_ALIVE |
michaeljson | 0:3817adfaeb06 | 90 | && ((h->missile_blk_x >= g->enemy_blk_x) && (h->missile_blk_x <= (g->enemy_blk_x + g->enemy_width)))) |
michaeljson | 0:3817adfaeb06 | 91 | { |
michaeljson | 0:3817adfaeb06 | 92 | enemy_erase(g); |
michaeljson | 0:3817adfaeb06 | 93 | g->status = ENEMY_DEAD; |
michaeljson | 0:3817adfaeb06 | 94 | enemy_died = 1; |
michaeljson | 0:3817adfaeb06 | 95 | h->status = PLAYER_MISSILE_EXPLODED; |
michaeljson | 0:3817adfaeb06 | 96 | } |
michaeljson | 0:3817adfaeb06 | 97 | |
michaeljson | 0:3817adfaeb06 | 98 | return enemy_died; |
michaeljson | 0:3817adfaeb06 | 99 | } |