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
main.cpp@2:4a3f97570578, 2021-04-15 (annotated)
- Committer:
- wminix3
- Date:
- Thu Apr 15 23:04:18 2021 +0000
- Revision:
- 2:4a3f97570578
- Parent:
- 1:618aa2c4ca6a
- Child:
- 3:e6c081c7f6f1
Basic revisions from original space invaders. Added extra menu options, "volatile" on global variables, and serial mbed. Changed pins to add serial with second mbed.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
michaeljson | 0:3817adfaeb06 | 1 | #include "mbed.h" |
michaeljson | 0:3817adfaeb06 | 2 | #include "SDFileSystem.h" |
michaeljson | 0:3817adfaeb06 | 3 | #include "wave_player.h" |
michaeljson | 0:3817adfaeb06 | 4 | #include "enemy.h" |
michaeljson | 0:3817adfaeb06 | 5 | #include "player.h" |
michaeljson | 0:3817adfaeb06 | 6 | #include "missile.h" |
michaeljson | 0:3817adfaeb06 | 7 | #include "globals.h" |
michaeljson | 0:3817adfaeb06 | 8 | #include "rtos.h" |
michaeljson | 0:3817adfaeb06 | 9 | #include <string> |
michaeljson | 0:3817adfaeb06 | 10 | |
michaeljson | 0:3817adfaeb06 | 11 | /* ==== Navigation Switch ===== */ |
michaeljson | 0:3817adfaeb06 | 12 | class Nav_Switch |
michaeljson | 0:3817adfaeb06 | 13 | { |
michaeljson | 0:3817adfaeb06 | 14 | public: |
michaeljson | 0:3817adfaeb06 | 15 | Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire); |
michaeljson | 0:3817adfaeb06 | 16 | int read(); |
michaeljson | 0:3817adfaeb06 | 17 | //boolean functions to test each switch |
michaeljson | 0:3817adfaeb06 | 18 | bool up(); |
michaeljson | 0:3817adfaeb06 | 19 | bool down(); |
michaeljson | 0:3817adfaeb06 | 20 | bool left(); |
michaeljson | 0:3817adfaeb06 | 21 | bool right(); |
michaeljson | 0:3817adfaeb06 | 22 | bool fire(); |
michaeljson | 0:3817adfaeb06 | 23 | //automatic read on RHS |
michaeljson | 0:3817adfaeb06 | 24 | operator int (); |
michaeljson | 0:3817adfaeb06 | 25 | //index to any switch array style |
michaeljson | 0:3817adfaeb06 | 26 | bool operator[](int index) { |
michaeljson | 0:3817adfaeb06 | 27 | return _pins[index]; |
michaeljson | 0:3817adfaeb06 | 28 | }; |
michaeljson | 0:3817adfaeb06 | 29 | private: |
michaeljson | 0:3817adfaeb06 | 30 | BusIn _pins; |
michaeljson | 0:3817adfaeb06 | 31 | |
michaeljson | 0:3817adfaeb06 | 32 | }; |
michaeljson | 0:3817adfaeb06 | 33 | Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire): |
michaeljson | 0:3817adfaeb06 | 34 | _pins(up, down, left, right, fire) |
michaeljson | 0:3817adfaeb06 | 35 | { |
michaeljson | 0:3817adfaeb06 | 36 | _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise |
michaeljson | 0:3817adfaeb06 | 37 | wait(0.001); //delays just a bit for pullups to pull inputs high |
michaeljson | 0:3817adfaeb06 | 38 | } |
michaeljson | 0:3817adfaeb06 | 39 | inline bool Nav_Switch::up() |
michaeljson | 0:3817adfaeb06 | 40 | { |
michaeljson | 0:3817adfaeb06 | 41 | return !(_pins[0]); |
michaeljson | 0:3817adfaeb06 | 42 | } |
michaeljson | 0:3817adfaeb06 | 43 | inline bool Nav_Switch::down() |
michaeljson | 0:3817adfaeb06 | 44 | { |
michaeljson | 0:3817adfaeb06 | 45 | return !(_pins[1]); |
michaeljson | 0:3817adfaeb06 | 46 | } |
michaeljson | 0:3817adfaeb06 | 47 | inline bool Nav_Switch::left() |
michaeljson | 0:3817adfaeb06 | 48 | { |
michaeljson | 0:3817adfaeb06 | 49 | return !(_pins[2]); |
michaeljson | 0:3817adfaeb06 | 50 | } |
michaeljson | 0:3817adfaeb06 | 51 | inline bool Nav_Switch::right() |
michaeljson | 0:3817adfaeb06 | 52 | { |
michaeljson | 0:3817adfaeb06 | 53 | return !(_pins[3]); |
michaeljson | 0:3817adfaeb06 | 54 | } |
michaeljson | 0:3817adfaeb06 | 55 | inline bool Nav_Switch::fire() |
michaeljson | 0:3817adfaeb06 | 56 | { |
michaeljson | 0:3817adfaeb06 | 57 | return !(_pins[4]); |
michaeljson | 0:3817adfaeb06 | 58 | } |
michaeljson | 0:3817adfaeb06 | 59 | inline int Nav_Switch::read() |
michaeljson | 0:3817adfaeb06 | 60 | { |
michaeljson | 0:3817adfaeb06 | 61 | return _pins.read(); |
michaeljson | 0:3817adfaeb06 | 62 | } |
michaeljson | 0:3817adfaeb06 | 63 | inline Nav_Switch::operator int () |
michaeljson | 0:3817adfaeb06 | 64 | { |
michaeljson | 0:3817adfaeb06 | 65 | return _pins.read(); |
michaeljson | 0:3817adfaeb06 | 66 | } |
michaeljson | 0:3817adfaeb06 | 67 | |
michaeljson | 0:3817adfaeb06 | 68 | // Platform initialization |
michaeljson | 0:3817adfaeb06 | 69 | uLCD_4DGL uLCD(p28,p27,p29); // LCD (serial tx, serial rx, reset pin;) |
michaeljson | 0:3817adfaeb06 | 70 | AnalogOut DACout(p18); // speaker |
michaeljson | 0:3817adfaeb06 | 71 | wave_player waver(&DACout); // wav player |
michaeljson | 0:3817adfaeb06 | 72 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card and filesystem (mosi, miso, sck, cs) |
wminix3 | 2:4a3f97570578 | 73 | Nav_Switch myNav(p16, p10, p11, p9, p12); //pin order on Sparkfun breakout. move U from p13 to p16 so we can use another Serial to communicate with mbed |
michaeljson | 0:3817adfaeb06 | 74 | DigitalIn pb(p15); // push button for player misisle fire |
wminix3 | 2:4a3f97570578 | 75 | Serial pc(USBTX, USBRX); |
wminix3 | 2:4a3f97570578 | 76 | Serial secondMbed(p13, p14); |
michaeljson | 0:3817adfaeb06 | 77 | // Initialize all global enemy objects |
michaeljson | 0:3817adfaeb06 | 78 | enemy_t enemy_1; |
michaeljson | 0:3817adfaeb06 | 79 | enemy_t enemy_2; |
michaeljson | 0:3817adfaeb06 | 80 | enemy_t enemy_3; |
michaeljson | 0:3817adfaeb06 | 81 | enemy_t enemy_4; |
michaeljson | 0:3817adfaeb06 | 82 | enemy_t enemy_5; |
michaeljson | 0:3817adfaeb06 | 83 | enemy_t enemy_6; |
michaeljson | 0:3817adfaeb06 | 84 | enemy_t enemy_7; |
michaeljson | 0:3817adfaeb06 | 85 | enemy_t enemy_8; |
michaeljson | 0:3817adfaeb06 | 86 | enemy_t enemy_9; |
michaeljson | 0:3817adfaeb06 | 87 | enemy_t enemy_10; |
michaeljson | 0:3817adfaeb06 | 88 | enemy_t enemy_11; |
michaeljson | 0:3817adfaeb06 | 89 | enemy_t enemy_12; |
michaeljson | 0:3817adfaeb06 | 90 | enemy_t enemy_13; |
michaeljson | 0:3817adfaeb06 | 91 | enemy_t enemy_14; |
michaeljson | 0:3817adfaeb06 | 92 | enemy_t enemy_15; |
michaeljson | 0:3817adfaeb06 | 93 | |
michaeljson | 0:3817adfaeb06 | 94 | // Initialize variables |
wminix3 | 2:4a3f97570578 | 95 | // Brice added "volatile" here to protect global variables. |
wminix3 | 2:4a3f97570578 | 96 | volatile int numOfEnemies = 0; |
wminix3 | 2:4a3f97570578 | 97 | volatile int ENEMY_MOVE = 1; |
wminix3 | 2:4a3f97570578 | 98 | volatile int MOVE_DOWN = 0; |
wminix3 | 2:4a3f97570578 | 99 | volatile int DIRECTION = 1; |
wminix3 | 2:4a3f97570578 | 100 | volatile int firing_col = 0; |
wminix3 | 2:4a3f97570578 | 101 | volatile int hit_player = 0; |
wminix3 | 2:4a3f97570578 | 102 | volatile bool lose = false; |
wminix3 | 2:4a3f97570578 | 103 | volatile int lives = 3; |
wminix3 | 2:4a3f97570578 | 104 | volatile bool game_menu = false; |
wminix3 | 2:4a3f97570578 | 105 | volatile bool begin_game = false; |
wminix3 | 2:4a3f97570578 | 106 | volatile bool gameover = false; |
wminix3 | 2:4a3f97570578 | 107 | volatile int numPlayers = 1; |
michaeljson | 0:3817adfaeb06 | 108 | |
michaeljson | 0:3817adfaeb06 | 109 | // Initialize global player object |
michaeljson | 0:3817adfaeb06 | 110 | player_t player; |
michaeljson | 0:3817adfaeb06 | 111 | |
michaeljson | 0:3817adfaeb06 | 112 | // Intialize global player and enemy missile |
michaeljson | 0:3817adfaeb06 | 113 | missile_t missile; // player missile |
michaeljson | 0:3817adfaeb06 | 114 | missile_t enemy_missile; // enemy missile |
michaeljson | 0:3817adfaeb06 | 115 | |
michaeljson | 0:3817adfaeb06 | 116 | // Array of enemy objects |
michaeljson | 0:3817adfaeb06 | 117 | enemy_t * enemyArray[15]; |
michaeljson | 0:3817adfaeb06 | 118 | |
michaeljson | 0:3817adfaeb06 | 119 | // Function Prototypes |
michaeljson | 0:3817adfaeb06 | 120 | void move_enemy_down(); |
michaeljson | 0:3817adfaeb06 | 121 | void playstart(void const *args); |
michaeljson | 0:3817adfaeb06 | 122 | |
michaeljson | 0:3817adfaeb06 | 123 | // Draws the enemies at the initial starting location |
michaeljson | 0:3817adfaeb06 | 124 | void draw_enemies_level() |
michaeljson | 0:3817adfaeb06 | 125 | { |
michaeljson | 0:3817adfaeb06 | 126 | // Initialize local variables |
michaeljson | 0:3817adfaeb06 | 127 | unsigned int start_x_pos = 12; |
michaeljson | 0:3817adfaeb06 | 128 | unsigned int start_enemy_y_pos = 20; |
michaeljson | 0:3817adfaeb06 | 129 | numOfEnemies = 15; |
michaeljson | 0:3817adfaeb06 | 130 | |
michaeljson | 0:3817adfaeb06 | 131 | // First Row of Enemies |
michaeljson | 0:3817adfaeb06 | 132 | enemy_init(&enemy_1,start_x_pos,start_enemy_y_pos,WHITE); // initialize x-pos and y-pos and color of enemy |
michaeljson | 0:3817adfaeb06 | 133 | enemy_show(&enemy_1); // displays the enemy on uLCD |
michaeljson | 0:3817adfaeb06 | 134 | |
michaeljson | 0:3817adfaeb06 | 135 | enemy_init(&enemy_2,start_x_pos+15,start_enemy_y_pos,WHITE); |
michaeljson | 0:3817adfaeb06 | 136 | enemy_show(&enemy_2); |
michaeljson | 0:3817adfaeb06 | 137 | |
michaeljson | 0:3817adfaeb06 | 138 | enemy_init(&enemy_3,start_x_pos+30,start_enemy_y_pos,WHITE); |
michaeljson | 0:3817adfaeb06 | 139 | enemy_show(&enemy_3); |
michaeljson | 0:3817adfaeb06 | 140 | |
michaeljson | 0:3817adfaeb06 | 141 | enemy_init(&enemy_4,start_x_pos+45,start_enemy_y_pos,WHITE); |
michaeljson | 0:3817adfaeb06 | 142 | enemy_show(&enemy_4); |
michaeljson | 0:3817adfaeb06 | 143 | |
michaeljson | 0:3817adfaeb06 | 144 | enemy_init(&enemy_5,start_x_pos+60,start_enemy_y_pos,WHITE); |
michaeljson | 0:3817adfaeb06 | 145 | enemy_show(&enemy_5); |
michaeljson | 0:3817adfaeb06 | 146 | |
michaeljson | 0:3817adfaeb06 | 147 | // Second Row of Enemies |
michaeljson | 0:3817adfaeb06 | 148 | enemy_init(&enemy_6,start_x_pos,start_enemy_y_pos+12,WHITE); |
michaeljson | 0:3817adfaeb06 | 149 | enemy_show(&enemy_6); |
michaeljson | 0:3817adfaeb06 | 150 | |
michaeljson | 0:3817adfaeb06 | 151 | enemy_init(&enemy_7,start_x_pos+15,start_enemy_y_pos+12,WHITE); |
michaeljson | 0:3817adfaeb06 | 152 | enemy_show(&enemy_7); |
michaeljson | 0:3817adfaeb06 | 153 | |
michaeljson | 0:3817adfaeb06 | 154 | enemy_init(&enemy_8,start_x_pos+30,start_enemy_y_pos+12,WHITE); |
michaeljson | 0:3817adfaeb06 | 155 | enemy_show(&enemy_8); |
michaeljson | 0:3817adfaeb06 | 156 | |
michaeljson | 0:3817adfaeb06 | 157 | enemy_init(&enemy_9,start_x_pos+45,start_enemy_y_pos+12,WHITE); |
michaeljson | 0:3817adfaeb06 | 158 | enemy_show(&enemy_9); |
michaeljson | 0:3817adfaeb06 | 159 | |
michaeljson | 0:3817adfaeb06 | 160 | enemy_init(&enemy_10,start_x_pos+60,start_enemy_y_pos+12,WHITE); |
michaeljson | 0:3817adfaeb06 | 161 | enemy_show(&enemy_10); |
michaeljson | 0:3817adfaeb06 | 162 | |
michaeljson | 0:3817adfaeb06 | 163 | // Third Row of Enemies |
michaeljson | 0:3817adfaeb06 | 164 | enemy_init(&enemy_11,start_x_pos,start_enemy_y_pos+24,WHITE); |
michaeljson | 0:3817adfaeb06 | 165 | enemy_show(&enemy_11); |
michaeljson | 0:3817adfaeb06 | 166 | |
michaeljson | 0:3817adfaeb06 | 167 | enemy_init(&enemy_12,start_x_pos+15,start_enemy_y_pos+24,WHITE); |
michaeljson | 0:3817adfaeb06 | 168 | enemy_show(&enemy_12); |
michaeljson | 0:3817adfaeb06 | 169 | |
michaeljson | 0:3817adfaeb06 | 170 | enemy_init(&enemy_13,start_x_pos+30,start_enemy_y_pos+24,WHITE); |
michaeljson | 0:3817adfaeb06 | 171 | enemy_show(&enemy_13); |
michaeljson | 0:3817adfaeb06 | 172 | |
michaeljson | 0:3817adfaeb06 | 173 | enemy_init(&enemy_14,start_x_pos+45,start_enemy_y_pos+24,WHITE); |
michaeljson | 0:3817adfaeb06 | 174 | enemy_show(&enemy_14); |
michaeljson | 0:3817adfaeb06 | 175 | |
michaeljson | 0:3817adfaeb06 | 176 | enemy_init(&enemy_15,start_x_pos+60,start_enemy_y_pos+24,WHITE); |
michaeljson | 0:3817adfaeb06 | 177 | enemy_show(&enemy_15); |
michaeljson | 0:3817adfaeb06 | 178 | |
michaeljson | 0:3817adfaeb06 | 179 | // Put enemy objects into array |
michaeljson | 0:3817adfaeb06 | 180 | enemyArray[0] = &enemy_1; |
michaeljson | 0:3817adfaeb06 | 181 | enemyArray[1] = &enemy_2; |
michaeljson | 0:3817adfaeb06 | 182 | enemyArray[2] = &enemy_3; |
michaeljson | 0:3817adfaeb06 | 183 | enemyArray[3] = &enemy_4; |
michaeljson | 0:3817adfaeb06 | 184 | enemyArray[4] = &enemy_5; |
michaeljson | 0:3817adfaeb06 | 185 | enemyArray[5] = &enemy_6; |
michaeljson | 0:3817adfaeb06 | 186 | enemyArray[6] = &enemy_7; |
michaeljson | 0:3817adfaeb06 | 187 | enemyArray[7] = &enemy_8; |
michaeljson | 0:3817adfaeb06 | 188 | enemyArray[8] = &enemy_9; |
michaeljson | 0:3817adfaeb06 | 189 | enemyArray[9] = &enemy_10; |
michaeljson | 0:3817adfaeb06 | 190 | enemyArray[10] = &enemy_11; |
michaeljson | 0:3817adfaeb06 | 191 | enemyArray[11] = &enemy_12; |
michaeljson | 0:3817adfaeb06 | 192 | enemyArray[12] = &enemy_13; |
michaeljson | 0:3817adfaeb06 | 193 | enemyArray[13] = &enemy_14; |
michaeljson | 0:3817adfaeb06 | 194 | enemyArray[14] = &enemy_15; |
michaeljson | 0:3817adfaeb06 | 195 | } |
michaeljson | 0:3817adfaeb06 | 196 | |
michaeljson | 0:3817adfaeb06 | 197 | // Draws the player at the initial starting location |
michaeljson | 0:3817adfaeb06 | 198 | void draw_initial_player() |
michaeljson | 0:3817adfaeb06 | 199 | { |
michaeljson | 0:3817adfaeb06 | 200 | int start_x_pos = 59; |
michaeljson | 0:3817adfaeb06 | 201 | int start_y_pos = 110; |
michaeljson | 0:3817adfaeb06 | 202 | |
michaeljson | 0:3817adfaeb06 | 203 | player_init(&player,start_x_pos,start_y_pos,WHITE); // intialize x-pos and y-pos and color of player |
michaeljson | 0:3817adfaeb06 | 204 | player_show(&player); // display player on uLCD |
michaeljson | 0:3817adfaeb06 | 205 | } |
michaeljson | 0:3817adfaeb06 | 206 | |
michaeljson | 0:3817adfaeb06 | 207 | // Checks all enemies in row 1 |
michaeljson | 0:3817adfaeb06 | 208 | void check_hit_enemy_row1() |
michaeljson | 0:3817adfaeb06 | 209 | { |
michaeljson | 0:3817adfaeb06 | 210 | int hit_enemy; |
michaeljson | 0:3817adfaeb06 | 211 | |
michaeljson | 0:3817adfaeb06 | 212 | // First Row of Enemies |
michaeljson | 0:3817adfaeb06 | 213 | hit_enemy = check_enemy(&enemy_1, &missile); // checks if the missile hits the enemy and returns 1 if hit, 0 if not hit |
michaeljson | 0:3817adfaeb06 | 214 | numOfEnemies = numOfEnemies - hit_enemy; // updates the number of enemies left |
michaeljson | 0:3817adfaeb06 | 215 | hit_enemy = check_enemy(&enemy_2, &missile); |
michaeljson | 0:3817adfaeb06 | 216 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 217 | hit_enemy = check_enemy(&enemy_3, &missile); |
michaeljson | 0:3817adfaeb06 | 218 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 219 | hit_enemy = check_enemy(&enemy_4, &missile); |
michaeljson | 0:3817adfaeb06 | 220 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 221 | hit_enemy = check_enemy(&enemy_5, &missile); |
michaeljson | 0:3817adfaeb06 | 222 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 223 | } |
michaeljson | 0:3817adfaeb06 | 224 | |
michaeljson | 0:3817adfaeb06 | 225 | // Same as check_hit_enemy_row1, but checks enemies at row 2 |
michaeljson | 0:3817adfaeb06 | 226 | void check_hit_enemy_row2() |
michaeljson | 0:3817adfaeb06 | 227 | { |
michaeljson | 0:3817adfaeb06 | 228 | int hit_enemy; |
michaeljson | 0:3817adfaeb06 | 229 | |
michaeljson | 0:3817adfaeb06 | 230 | // Second Row of Enemies |
michaeljson | 0:3817adfaeb06 | 231 | hit_enemy = check_enemy(&enemy_6, &missile); |
michaeljson | 0:3817adfaeb06 | 232 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 233 | hit_enemy = check_enemy(&enemy_7, &missile); |
michaeljson | 0:3817adfaeb06 | 234 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 235 | hit_enemy = check_enemy(&enemy_8, &missile); |
michaeljson | 0:3817adfaeb06 | 236 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 237 | hit_enemy = check_enemy(&enemy_9, &missile); |
michaeljson | 0:3817adfaeb06 | 238 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 239 | hit_enemy = check_enemy(&enemy_10, &missile); |
michaeljson | 0:3817adfaeb06 | 240 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 241 | } |
michaeljson | 0:3817adfaeb06 | 242 | |
michaeljson | 0:3817adfaeb06 | 243 | // Same as check_hit_enemy_row1, but checks enemies at row 3 |
michaeljson | 0:3817adfaeb06 | 244 | void check_hit_enemy_row3() |
michaeljson | 0:3817adfaeb06 | 245 | { |
michaeljson | 0:3817adfaeb06 | 246 | int hit_enemy; |
michaeljson | 0:3817adfaeb06 | 247 | |
michaeljson | 0:3817adfaeb06 | 248 | // Third Row of Enemies |
michaeljson | 0:3817adfaeb06 | 249 | hit_enemy = check_enemy(&enemy_11, &missile); |
michaeljson | 0:3817adfaeb06 | 250 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 251 | hit_enemy = check_enemy(&enemy_12, &missile); |
michaeljson | 0:3817adfaeb06 | 252 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 253 | hit_enemy = check_enemy(&enemy_13, &missile); |
michaeljson | 0:3817adfaeb06 | 254 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 255 | hit_enemy = check_enemy(&enemy_14, &missile); |
michaeljson | 0:3817adfaeb06 | 256 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 257 | hit_enemy = check_enemy(&enemy_15, &missile); |
michaeljson | 0:3817adfaeb06 | 258 | numOfEnemies = numOfEnemies - hit_enemy; |
michaeljson | 0:3817adfaeb06 | 259 | } |
michaeljson | 0:3817adfaeb06 | 260 | |
michaeljson | 0:3817adfaeb06 | 261 | // Checks if player is hit |
michaeljson | 0:3817adfaeb06 | 262 | void check_player_hit() |
michaeljson | 0:3817adfaeb06 | 263 | { |
michaeljson | 0:3817adfaeb06 | 264 | hit_player = check_player(&player, &enemy_missile); // checks if the missile hits the player and returns 1 if hit, 0 if not hit |
michaeljson | 0:3817adfaeb06 | 265 | } |
michaeljson | 0:3817adfaeb06 | 266 | |
michaeljson | 0:3817adfaeb06 | 267 | // Randomly selects an enemy to fire and updates the position of where the missile will fire from |
michaeljson | 0:3817adfaeb06 | 268 | void random_attack_gen() |
michaeljson | 0:3817adfaeb06 | 269 | { |
michaeljson | 0:3817adfaeb06 | 270 | firing_col = rand() % 5; // selects a random column |
michaeljson | 0:3817adfaeb06 | 271 | |
michaeljson | 0:3817adfaeb06 | 272 | // first checks if the 3rd row closest to the player is alive |
michaeljson | 0:3817adfaeb06 | 273 | if (enemyArray[firing_col+10]->status == ENEMY_ALIVE) |
michaeljson | 0:3817adfaeb06 | 274 | { |
michaeljson | 0:3817adfaeb06 | 275 | // If alive, the enemy missile position is updated to the center of the enemy |
michaeljson | 0:3817adfaeb06 | 276 | enemy_missile.missile_blk_x = enemyArray[firing_col+10]->enemy_blk_x + (enemyArray[firing_col+10]->enemy_width/2); |
michaeljson | 0:3817adfaeb06 | 277 | enemy_missile.missile_blk_y = enemyArray[firing_col+10]->enemy_blk_y + enemyArray[firing_col+10]->enemy_height + 1; |
michaeljson | 0:3817adfaeb06 | 278 | enemy_missile.status = ENEMY_MISSILE_ACTIVE; // sets the enemy missile as active |
michaeljson | 0:3817adfaeb06 | 279 | } |
michaeljson | 0:3817adfaeb06 | 280 | // if enemy at 3rd row is dead, checks the enemy in the 2nd row |
michaeljson | 0:3817adfaeb06 | 281 | else if (enemyArray[firing_col+5]->status == ENEMY_ALIVE) |
michaeljson | 0:3817adfaeb06 | 282 | { |
michaeljson | 0:3817adfaeb06 | 283 | // If alive, the enemy missile position is updated to the center of the enemy |
michaeljson | 0:3817adfaeb06 | 284 | enemy_missile.missile_blk_x = enemyArray[firing_col+5]->enemy_blk_x + (enemyArray[firing_col+5]->enemy_width/2); |
michaeljson | 0:3817adfaeb06 | 285 | enemy_missile.missile_blk_y = enemyArray[firing_col+5]->enemy_blk_y + enemyArray[firing_col+5]->enemy_height + 1; |
michaeljson | 0:3817adfaeb06 | 286 | enemy_missile.status = ENEMY_MISSILE_ACTIVE; |
michaeljson | 0:3817adfaeb06 | 287 | } |
michaeljson | 0:3817adfaeb06 | 288 | // if enemy at 2nd and 3rd row is dead, checks the enemy in the 1st row |
michaeljson | 0:3817adfaeb06 | 289 | else if (enemyArray[firing_col]->status == ENEMY_ALIVE) |
michaeljson | 0:3817adfaeb06 | 290 | { |
michaeljson | 0:3817adfaeb06 | 291 | // If alive, the enemy missile position is updated to the center of the enemy |
michaeljson | 0:3817adfaeb06 | 292 | enemy_missile.missile_blk_x = enemyArray[firing_col]->enemy_blk_x + (enemyArray[firing_col]->enemy_width/2); |
michaeljson | 0:3817adfaeb06 | 293 | enemy_missile.missile_blk_y = enemyArray[firing_col]->enemy_blk_y + enemyArray[firing_col]->enemy_height + 1; |
michaeljson | 0:3817adfaeb06 | 294 | enemy_missile.status = ENEMY_MISSILE_ACTIVE; |
michaeljson | 0:3817adfaeb06 | 295 | } |
michaeljson | 0:3817adfaeb06 | 296 | } |
michaeljson | 0:3817adfaeb06 | 297 | |
michaeljson | 0:3817adfaeb06 | 298 | // moves the enemy |
michaeljson | 0:3817adfaeb06 | 299 | void enemy_motion() |
michaeljson | 0:3817adfaeb06 | 300 | { |
michaeljson | 0:3817adfaeb06 | 301 | // will move the enemy every 6 loops |
michaeljson | 0:3817adfaeb06 | 302 | if (ENEMY_MOVE % 6 == 0) |
michaeljson | 0:3817adfaeb06 | 303 | { |
michaeljson | 0:3817adfaeb06 | 304 | // FIrst Row of Enemies |
michaeljson | 0:3817adfaeb06 | 305 | MOVE_DOWN = move_enemy(&enemy_1, MOVE_DOWN, DIRECTION); // moves the enemy based on the DIRECTION passed in and also sends global MOVE_DOWN to update in enemy.cpp |
michaeljson | 0:3817adfaeb06 | 306 | MOVE_DOWN = move_enemy(&enemy_2, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 1 enemies reach the left or right edge of the screen |
michaeljson | 0:3817adfaeb06 | 307 | MOVE_DOWN = move_enemy(&enemy_3, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 2 if enemies reach the player, otherwise 0 |
michaeljson | 0:3817adfaeb06 | 308 | MOVE_DOWN = move_enemy(&enemy_4, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 309 | MOVE_DOWN = move_enemy(&enemy_5, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 310 | |
michaeljson | 0:3817adfaeb06 | 311 | // Second Row of Enemies |
michaeljson | 0:3817adfaeb06 | 312 | MOVE_DOWN = move_enemy(&enemy_6, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 313 | MOVE_DOWN = move_enemy(&enemy_7, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 314 | MOVE_DOWN = move_enemy(&enemy_8, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 315 | MOVE_DOWN = move_enemy(&enemy_9, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 316 | MOVE_DOWN = move_enemy(&enemy_10, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 317 | |
michaeljson | 0:3817adfaeb06 | 318 | // Third Row of Enemies |
michaeljson | 0:3817adfaeb06 | 319 | MOVE_DOWN = move_enemy(&enemy_11, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 320 | MOVE_DOWN = move_enemy(&enemy_12, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 321 | MOVE_DOWN = move_enemy(&enemy_13, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 322 | MOVE_DOWN = move_enemy(&enemy_14, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 323 | MOVE_DOWN = move_enemy(&enemy_15, MOVE_DOWN, DIRECTION); |
michaeljson | 0:3817adfaeb06 | 324 | |
michaeljson | 0:3817adfaeb06 | 325 | // if MOVE_DOWN is 2, then the enemies have reached the player |
michaeljson | 0:3817adfaeb06 | 326 | if (MOVE_DOWN == 2) |
michaeljson | 0:3817adfaeb06 | 327 | { |
michaeljson | 0:3817adfaeb06 | 328 | lose = true; // set global lose to true to go to gameover screen |
michaeljson | 0:3817adfaeb06 | 329 | } |
michaeljson | 0:3817adfaeb06 | 330 | |
michaeljson | 0:3817adfaeb06 | 331 | // if MOVE_DOWN is 1, update the y-pos of the enemies |
michaeljson | 0:3817adfaeb06 | 332 | if (MOVE_DOWN == 1) |
michaeljson | 0:3817adfaeb06 | 333 | { |
michaeljson | 0:3817adfaeb06 | 334 | move_enemy_down(); // updates the y-pos of the enemies |
michaeljson | 0:3817adfaeb06 | 335 | |
michaeljson | 0:3817adfaeb06 | 336 | // Flips the direction when the enemy moves down |
michaeljson | 0:3817adfaeb06 | 337 | if (DIRECTION == 1) |
michaeljson | 0:3817adfaeb06 | 338 | { |
michaeljson | 0:3817adfaeb06 | 339 | DIRECTION = 2; |
michaeljson | 0:3817adfaeb06 | 340 | } |
michaeljson | 0:3817adfaeb06 | 341 | else |
michaeljson | 0:3817adfaeb06 | 342 | { |
michaeljson | 0:3817adfaeb06 | 343 | DIRECTION = 1; |
michaeljson | 0:3817adfaeb06 | 344 | } |
michaeljson | 0:3817adfaeb06 | 345 | MOVE_DOWN = 0; // sets MOVE_DOWN back to 0 to stop down movement until |
michaeljson | 0:3817adfaeb06 | 346 | } |
michaeljson | 0:3817adfaeb06 | 347 | |
michaeljson | 0:3817adfaeb06 | 348 | ENEMY_MOVE += 1; |
michaeljson | 0:3817adfaeb06 | 349 | } |
michaeljson | 0:3817adfaeb06 | 350 | else |
michaeljson | 0:3817adfaeb06 | 351 | { |
michaeljson | 0:3817adfaeb06 | 352 | ENEMY_MOVE += 1; |
michaeljson | 0:3817adfaeb06 | 353 | } |
michaeljson | 0:3817adfaeb06 | 354 | } |
michaeljson | 0:3817adfaeb06 | 355 | |
michaeljson | 0:3817adfaeb06 | 356 | // moves all the enemies down in the y-direction |
michaeljson | 0:3817adfaeb06 | 357 | void move_enemy_down() |
michaeljson | 0:3817adfaeb06 | 358 | { |
michaeljson | 0:3817adfaeb06 | 359 | // First Row of Enemies |
michaeljson | 0:3817adfaeb06 | 360 | enemy_erase(&enemy_1); |
michaeljson | 0:3817adfaeb06 | 361 | enemy_erase(&enemy_2); |
michaeljson | 0:3817adfaeb06 | 362 | enemy_erase(&enemy_3); |
michaeljson | 0:3817adfaeb06 | 363 | enemy_erase(&enemy_4); |
michaeljson | 0:3817adfaeb06 | 364 | enemy_erase(&enemy_5); |
michaeljson | 0:3817adfaeb06 | 365 | |
michaeljson | 0:3817adfaeb06 | 366 | enemy_1.enemy_blk_y += enemy_1.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 367 | enemy_2.enemy_blk_y += enemy_2.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 368 | enemy_3.enemy_blk_y += enemy_3.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 369 | enemy_4.enemy_blk_y += enemy_4.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 370 | enemy_5.enemy_blk_y += enemy_5.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 371 | |
michaeljson | 0:3817adfaeb06 | 372 | // Second Row of Enemies |
michaeljson | 0:3817adfaeb06 | 373 | enemy_erase(&enemy_6); |
michaeljson | 0:3817adfaeb06 | 374 | enemy_erase(&enemy_7); |
michaeljson | 0:3817adfaeb06 | 375 | enemy_erase(&enemy_8); |
michaeljson | 0:3817adfaeb06 | 376 | enemy_erase(&enemy_9); |
michaeljson | 0:3817adfaeb06 | 377 | enemy_erase(&enemy_10); |
michaeljson | 0:3817adfaeb06 | 378 | |
michaeljson | 0:3817adfaeb06 | 379 | enemy_6.enemy_blk_y += enemy_6.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 380 | enemy_7.enemy_blk_y += enemy_7.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 381 | enemy_8.enemy_blk_y += enemy_8.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 382 | enemy_9.enemy_blk_y += enemy_9.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 383 | enemy_10.enemy_blk_y += enemy_10.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 384 | |
michaeljson | 0:3817adfaeb06 | 385 | // Third Row of Enemies |
michaeljson | 0:3817adfaeb06 | 386 | enemy_erase(&enemy_11); |
michaeljson | 0:3817adfaeb06 | 387 | enemy_erase(&enemy_12); |
michaeljson | 0:3817adfaeb06 | 388 | enemy_erase(&enemy_13); |
michaeljson | 0:3817adfaeb06 | 389 | enemy_erase(&enemy_14); |
michaeljson | 0:3817adfaeb06 | 390 | enemy_erase(&enemy_15); |
michaeljson | 0:3817adfaeb06 | 391 | |
michaeljson | 0:3817adfaeb06 | 392 | enemy_11.enemy_blk_y += enemy_11.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 393 | enemy_12.enemy_blk_y += enemy_12.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 394 | enemy_13.enemy_blk_y += enemy_13.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 395 | enemy_14.enemy_blk_y += enemy_14.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 396 | enemy_15.enemy_blk_y += enemy_15.enemy_height+4; |
michaeljson | 0:3817adfaeb06 | 397 | } |
michaeljson | 0:3817adfaeb06 | 398 | |
michaeljson | 0:3817adfaeb06 | 399 | // thread that plays sounds during game |
michaeljson | 0:3817adfaeb06 | 400 | void playstart(void const *args)//Th |
michaeljson | 0:3817adfaeb06 | 401 | { //Depending on the state of the game, |
michaeljson | 0:3817adfaeb06 | 402 | //queue either screen music or play sound effect upon fire |
michaeljson | 0:3817adfaeb06 | 403 | while(true) { |
michaeljson | 0:3817adfaeb06 | 404 | FILE *wave_file; |
michaeljson | 0:3817adfaeb06 | 405 | |
michaeljson | 0:3817adfaeb06 | 406 | // plays intro music during menu screen |
michaeljson | 0:3817adfaeb06 | 407 | while(game_menu) |
michaeljson | 0:3817adfaeb06 | 408 | { |
wminix3 | 2:4a3f97570578 | 409 | wave_file=fopen("/sd/wavfiles/futureEdit2.wav","r"); |
wminix3 | 2:4a3f97570578 | 410 | if(wave_file==NULL) pc.printf("file open error!\n\n\r"); // added this for open error check |
michaeljson | 0:3817adfaeb06 | 411 | waver.play(wave_file); |
michaeljson | 0:3817adfaeb06 | 412 | fclose(wave_file); |
michaeljson | 0:3817adfaeb06 | 413 | } |
michaeljson | 0:3817adfaeb06 | 414 | |
michaeljson | 0:3817adfaeb06 | 415 | // Checks in game sound conditions |
michaeljson | 0:3817adfaeb06 | 416 | while(begin_game) |
michaeljson | 0:3817adfaeb06 | 417 | { |
michaeljson | 0:3817adfaeb06 | 418 | // play firing sound when the player fires |
michaeljson | 0:3817adfaeb06 | 419 | if(!pb && missile.status == PLAYER_MISSILE_INACTIVE) { |
michaeljson | 0:3817adfaeb06 | 420 | |
wminix3 | 2:4a3f97570578 | 421 | wave_file=fopen("/sd/wavfiles/laserEdit.wav","r"); |
wminix3 | 2:4a3f97570578 | 422 | if(wave_file==NULL) pc.printf("laser file open error!\n\n\r"); // added this for open error check |
michaeljson | 0:3817adfaeb06 | 423 | |
michaeljson | 0:3817adfaeb06 | 424 | waver.play(wave_file); |
michaeljson | 0:3817adfaeb06 | 425 | fclose(wave_file); |
michaeljson | 0:3817adfaeb06 | 426 | } |
michaeljson | 0:3817adfaeb06 | 427 | |
michaeljson | 0:3817adfaeb06 | 428 | // if player hit, play hit sound |
michaeljson | 0:3817adfaeb06 | 429 | if (hit_player) |
michaeljson | 0:3817adfaeb06 | 430 | { |
wminix3 | 2:4a3f97570578 | 431 | wave_file=fopen("/sd/wavfiles/bigExplosionEdit2.wav","r"); |
wminix3 | 2:4a3f97570578 | 432 | if(wave_file==NULL) pc.printf("explosion file open error!\n\n\r"); // added this for open error check |
michaeljson | 0:3817adfaeb06 | 433 | waver.play(wave_file); |
michaeljson | 0:3817adfaeb06 | 434 | fclose(wave_file); |
michaeljson | 0:3817adfaeb06 | 435 | } |
michaeljson | 0:3817adfaeb06 | 436 | } |
michaeljson | 0:3817adfaeb06 | 437 | |
michaeljson | 0:3817adfaeb06 | 438 | // players gameover voice if player loses |
michaeljson | 0:3817adfaeb06 | 439 | while(gameover) |
michaeljson | 0:3817adfaeb06 | 440 | { |
wminix3 | 2:4a3f97570578 | 441 | wave_file=fopen("/sd/wavfiles/comicalgameoverEdit.wav","r"); |
wminix3 | 2:4a3f97570578 | 442 | if(wave_file==NULL) pc.printf("gameover file open error!\n\n\r"); // added this for open error check |
michaeljson | 0:3817adfaeb06 | 443 | waver.play(wave_file); |
michaeljson | 0:3817adfaeb06 | 444 | fclose(wave_file); |
michaeljson | 0:3817adfaeb06 | 445 | } |
michaeljson | 0:3817adfaeb06 | 446 | } |
michaeljson | 0:3817adfaeb06 | 447 | } |
michaeljson | 0:3817adfaeb06 | 448 | |
michaeljson | 0:3817adfaeb06 | 449 | int main() { |
michaeljson | 0:3817adfaeb06 | 450 | |
michaeljson | 0:3817adfaeb06 | 451 | // Initialization of Setup variables |
michaeljson | 0:3817adfaeb06 | 452 | int blk_x, blk_y; |
michaeljson | 0:3817adfaeb06 | 453 | pb.mode(PullUp); |
michaeljson | 0:3817adfaeb06 | 454 | |
michaeljson | 0:3817adfaeb06 | 455 | Thread thread(playstart); // intializes the thread to play sound |
michaeljson | 0:3817adfaeb06 | 456 | |
michaeljson | 0:3817adfaeb06 | 457 | uLCD.baudrate(500000); // set to 500000 to increase smooth gameplay |
michaeljson | 0:3817adfaeb06 | 458 | |
michaeljson | 0:3817adfaeb06 | 459 | // Initialization of Game Menu variables |
michaeljson | 0:3817adfaeb06 | 460 | const int title_x_pos = 2; // initial x-pos of title |
michaeljson | 0:3817adfaeb06 | 461 | const int title_y_pos = 3; // initial y-pos of title |
michaeljson | 0:3817adfaeb06 | 462 | int start_label_x_pos = 7; // start label x-pos |
michaeljson | 0:3817adfaeb06 | 463 | int start_label_y_pos = 7; // start label y-pos |
michaeljson | 0:3817adfaeb06 | 464 | int level_cursor_x_pos = 5; // level cursor x-position |
wminix3 | 2:4a3f97570578 | 465 | int level_cursor_y_pos_start = 7; // level cursor y-position |
wminix3 | 2:4a3f97570578 | 466 | //int level_cursor_y_pos = 7; // initial level_cursor_y_pos @ start -- Added by Brice for more menu options |
wminix3 | 2:4a3f97570578 | 467 | int level_cursor_y_pos_end = 8; // BOTTOM CURSOR POS -- Added by Brice for more menu options |
michaeljson | 0:3817adfaeb06 | 468 | int gameover_x_pos = 5; // gameover label x-position |
michaeljson | 0:3817adfaeb06 | 469 | int gameover_y_pos = 5; // gameover label y-position |
michaeljson | 0:3817adfaeb06 | 470 | int win_x_pos = 2; // congratulations label x-position |
michaeljson | 0:3817adfaeb06 | 471 | int win_y_pos = 5; // congratulations label y-position |
michaeljson | 0:3817adfaeb06 | 472 | int startover_x_pos = 3; // startover label x-position |
michaeljson | 0:3817adfaeb06 | 473 | int startover_y_pos = 8; // startover label y-position |
michaeljson | 0:3817adfaeb06 | 474 | |
michaeljson | 0:3817adfaeb06 | 475 | // intialize temporary score and current score |
michaeljson | 0:3817adfaeb06 | 476 | int temp = 0; |
michaeljson | 0:3817adfaeb06 | 477 | int score = 0; |
michaeljson | 0:3817adfaeb06 | 478 | |
wminix3 | 2:4a3f97570578 | 479 | // Additional globals added for two-player and one-player capabilities (by Brice) |
wminix3 | 2:4a3f97570578 | 480 | |
michaeljson | 0:3817adfaeb06 | 481 | // Begin game loop |
michaeljson | 0:3817adfaeb06 | 482 | while(1) |
michaeljson | 0:3817adfaeb06 | 483 | { |
michaeljson | 0:3817adfaeb06 | 484 | // initialize all starting conditions for the beginning of the game |
michaeljson | 0:3817adfaeb06 | 485 | game_menu = true; // defaults to display menu screen |
michaeljson | 0:3817adfaeb06 | 486 | ENEMY_MOVE = true; // defaults to move enemy |
michaeljson | 0:3817adfaeb06 | 487 | DIRECTION = 1; // default to move right |
michaeljson | 0:3817adfaeb06 | 488 | hit_player = 0; // default to not player hit |
michaeljson | 0:3817adfaeb06 | 489 | MOVE_DOWN = 0; // default to not move down |
michaeljson | 0:3817adfaeb06 | 490 | lose = false; // default to not lose |
michaeljson | 0:3817adfaeb06 | 491 | lives = 3; // defaults to 3 lives |
michaeljson | 0:3817adfaeb06 | 492 | score = 0; // default to score of 0 |
wminix3 | 2:4a3f97570578 | 493 | int level_cursor_y_pos = 7; // initial level_cursor_y_pos @ start -- Added by Brice for more menu options |
michaeljson | 0:3817adfaeb06 | 494 | uLCD.cls(); |
wminix3 | 2:4a3f97570578 | 495 | // Brice moved this out of the loop since it shouldn't change |
wminix3 | 2:4a3f97570578 | 496 | //uLCD.locate(title_x_pos,title_y_pos); // "SPACE INVADERS" title position |
wminix3 | 2:4a3f97570578 | 497 | //uLCD.printf("SPACE INVADERS"); // Title |
michaeljson | 0:3817adfaeb06 | 498 | // Implementation of Game Menu |
michaeljson | 0:3817adfaeb06 | 499 | while(game_menu) |
michaeljson | 0:3817adfaeb06 | 500 | { |
wminix3 | 2:4a3f97570578 | 501 | // Brice added this in order to move the cursor through the menu options |
wminix3 | 2:4a3f97570578 | 502 | uLCD.locate(level_cursor_x_pos, level_cursor_y_pos); |
wminix3 | 2:4a3f97570578 | 503 | uLCD.printf(" "); |
wminix3 | 2:4a3f97570578 | 504 | if (myNav.down() && level_cursor_y_pos < level_cursor_y_pos_end) { |
wminix3 | 2:4a3f97570578 | 505 | level_cursor_y_pos += 1; |
wminix3 | 2:4a3f97570578 | 506 | } else if (myNav.up() && level_cursor_y_pos > level_cursor_y_pos_start) { |
wminix3 | 2:4a3f97570578 | 507 | level_cursor_y_pos -= 1; |
wminix3 | 2:4a3f97570578 | 508 | } |
wminix3 | 2:4a3f97570578 | 509 | // end of movable cursor |
michaeljson | 0:3817adfaeb06 | 510 | uLCD.locate(level_cursor_x_pos,level_cursor_y_pos); // draws cursor next to "START" label |
michaeljson | 0:3817adfaeb06 | 511 | uLCD.printf("->"); |
michaeljson | 0:3817adfaeb06 | 512 | |
michaeljson | 0:3817adfaeb06 | 513 | uLCD.locate(title_x_pos,title_y_pos); // "SPACE INVADERS" title position |
michaeljson | 0:3817adfaeb06 | 514 | uLCD.printf("SPACE INVADERS"); // Title |
michaeljson | 0:3817adfaeb06 | 515 | |
michaeljson | 0:3817adfaeb06 | 516 | uLCD.locate(start_label_x_pos,start_label_y_pos); // "START" label position |
wminix3 | 2:4a3f97570578 | 517 | uLCD.printf("ONE-PLAYER"); |
wminix3 | 2:4a3f97570578 | 518 | |
wminix3 | 2:4a3f97570578 | 519 | uLCD.locate(start_label_x_pos,start_label_y_pos + 1); |
wminix3 | 2:4a3f97570578 | 520 | uLCD.printf("TWO-PLAYER"); |
michaeljson | 0:3817adfaeb06 | 521 | // if pushbutton is pressed, game menu is exited and game begins |
michaeljson | 0:3817adfaeb06 | 522 | if(!pb) |
michaeljson | 0:3817adfaeb06 | 523 | { |
michaeljson | 0:3817adfaeb06 | 524 | game_menu = false; |
wminix3 | 2:4a3f97570578 | 525 | if (level_cursor_y_pos == start_label_y_pos) { |
wminix3 | 2:4a3f97570578 | 526 | numPlayers = 1; |
wminix3 | 2:4a3f97570578 | 527 | } else if (level_cursor_y_pos == start_label_y_pos + 1) { |
wminix3 | 2:4a3f97570578 | 528 | numPlayers = 2; |
wminix3 | 2:4a3f97570578 | 529 | } |
michaeljson | 0:3817adfaeb06 | 530 | wait(0.5); |
michaeljson | 0:3817adfaeb06 | 531 | } |
michaeljson | 0:3817adfaeb06 | 532 | } |
michaeljson | 0:3817adfaeb06 | 533 | |
michaeljson | 0:3817adfaeb06 | 534 | begin_game = true; // defaults begin_game to true |
michaeljson | 0:3817adfaeb06 | 535 | |
michaeljson | 0:3817adfaeb06 | 536 | uLCD.cls(); |
michaeljson | 0:3817adfaeb06 | 537 | |
michaeljson | 0:3817adfaeb06 | 538 | // Draw the enemies |
michaeljson | 0:3817adfaeb06 | 539 | draw_enemies_level(); |
michaeljson | 0:3817adfaeb06 | 540 | |
michaeljson | 0:3817adfaeb06 | 541 | // Draw the player |
michaeljson | 0:3817adfaeb06 | 542 | draw_initial_player(); |
michaeljson | 0:3817adfaeb06 | 543 | |
michaeljson | 0:3817adfaeb06 | 544 | // sets the initial position of player missile and enemy missile (later updated) |
michaeljson | 0:3817adfaeb06 | 545 | blk_x = player.player_blk_x+(player.player_width/2); |
michaeljson | 0:3817adfaeb06 | 546 | blk_y = player.player_blk_y; |
michaeljson | 0:3817adfaeb06 | 547 | missile_init(&missile, blk_x, blk_y, WHITE); |
michaeljson | 1:618aa2c4ca6a | 548 | int e_blk_x = 0; |
michaeljson | 1:618aa2c4ca6a | 549 | int e_blk_y = 2; |
michaeljson | 1:618aa2c4ca6a | 550 | enemy_missile_init(&enemy_missile, e_blk_x, e_blk_y, WHITE); |
michaeljson | 0:3817adfaeb06 | 551 | |
michaeljson | 0:3817adfaeb06 | 552 | // prints lives |
michaeljson | 0:3817adfaeb06 | 553 | uLCD.locate(0,0); |
michaeljson | 0:3817adfaeb06 | 554 | uLCD.printf("Lives:%i", lives); |
michaeljson | 0:3817adfaeb06 | 555 | |
michaeljson | 0:3817adfaeb06 | 556 | // prints score |
michaeljson | 0:3817adfaeb06 | 557 | uLCD.locate(9,0); |
michaeljson | 0:3817adfaeb06 | 558 | uLCD.printf("Score:%i", score); |
michaeljson | 0:3817adfaeb06 | 559 | |
michaeljson | 0:3817adfaeb06 | 560 | // game play loop |
michaeljson | 0:3817adfaeb06 | 561 | while(begin_game) |
michaeljson | 0:3817adfaeb06 | 562 | { |
michaeljson | 0:3817adfaeb06 | 563 | // updates score |
michaeljson | 0:3817adfaeb06 | 564 | temp = score; |
michaeljson | 0:3817adfaeb06 | 565 | score = (15-numOfEnemies)*15; |
michaeljson | 0:3817adfaeb06 | 566 | |
michaeljson | 0:3817adfaeb06 | 567 | // prints score if score changes |
michaeljson | 0:3817adfaeb06 | 568 | if (score != temp) |
michaeljson | 0:3817adfaeb06 | 569 | { |
michaeljson | 0:3817adfaeb06 | 570 | uLCD.locate(9,0); |
michaeljson | 0:3817adfaeb06 | 571 | uLCD.printf("Score:%i", score); |
michaeljson | 0:3817adfaeb06 | 572 | } |
michaeljson | 0:3817adfaeb06 | 573 | |
michaeljson | 0:3817adfaeb06 | 574 | // move enemy |
michaeljson | 0:3817adfaeb06 | 575 | enemy_motion(); |
michaeljson | 0:3817adfaeb06 | 576 | |
michaeljson | 0:3817adfaeb06 | 577 | // checks if player missile passes y-pos of row1 |
michaeljson | 0:3817adfaeb06 | 578 | if (missile.missile_blk_y+1-missile.missile_height <= enemy_1.enemy_blk_y |
michaeljson | 0:3817adfaeb06 | 579 | && missile.missile_blk_y+1-missile.missile_height >= enemy_1.enemy_blk_y-enemy_1.enemy_height) |
michaeljson | 0:3817adfaeb06 | 580 | { |
michaeljson | 0:3817adfaeb06 | 581 | check_hit_enemy_row1(); |
michaeljson | 0:3817adfaeb06 | 582 | } |
michaeljson | 0:3817adfaeb06 | 583 | |
michaeljson | 0:3817adfaeb06 | 584 | // checks if player missile passes y-pos of row2 |
michaeljson | 0:3817adfaeb06 | 585 | if (missile.missile_blk_y+1-missile.missile_height <= enemy_6.enemy_blk_y |
michaeljson | 0:3817adfaeb06 | 586 | && missile.missile_blk_y+1-missile.missile_height >= enemy_6.enemy_blk_y-enemy_6.enemy_height) |
michaeljson | 0:3817adfaeb06 | 587 | { |
michaeljson | 0:3817adfaeb06 | 588 | check_hit_enemy_row2(); |
michaeljson | 0:3817adfaeb06 | 589 | } |
michaeljson | 0:3817adfaeb06 | 590 | |
michaeljson | 0:3817adfaeb06 | 591 | // checks if player missile passes y-pos of row3 |
michaeljson | 0:3817adfaeb06 | 592 | if (missile.missile_blk_y+1-missile.missile_height <= enemy_11.enemy_blk_y |
michaeljson | 0:3817adfaeb06 | 593 | && missile.missile_blk_y+1-missile.missile_height >= enemy_11.enemy_blk_y-enemy_11.enemy_height) |
michaeljson | 0:3817adfaeb06 | 594 | { |
michaeljson | 0:3817adfaeb06 | 595 | check_hit_enemy_row3(); |
michaeljson | 0:3817adfaeb06 | 596 | } |
michaeljson | 0:3817adfaeb06 | 597 | |
michaeljson | 0:3817adfaeb06 | 598 | // Random Enemy Fire |
michaeljson | 0:3817adfaeb06 | 599 | if (enemy_missile.status == ENEMY_MISSILE_INACTIVE) |
michaeljson | 0:3817adfaeb06 | 600 | { |
michaeljson | 0:3817adfaeb06 | 601 | random_attack_gen(); |
michaeljson | 0:3817adfaeb06 | 602 | } |
michaeljson | 0:3817adfaeb06 | 603 | |
michaeljson | 0:3817adfaeb06 | 604 | // checks if enemy missile passes y-pos of player |
michaeljson | 0:3817adfaeb06 | 605 | if (enemy_missile.missile_blk_y >= player.player_blk_y |
michaeljson | 0:3817adfaeb06 | 606 | && enemy_missile.missile_blk_y <= player.player_blk_y+player.player_height) |
michaeljson | 0:3817adfaeb06 | 607 | { |
michaeljson | 0:3817adfaeb06 | 608 | check_player_hit(); |
michaeljson | 0:3817adfaeb06 | 609 | } |
michaeljson | 0:3817adfaeb06 | 610 | |
michaeljson | 0:3817adfaeb06 | 611 | update_missile_pos(&missile); // updates player missile position |
michaeljson | 0:3817adfaeb06 | 612 | update_enemy_missile_pos(&enemy_missile); // updates enemy missile position |
michaeljson | 0:3817adfaeb06 | 613 | |
michaeljson | 0:3817adfaeb06 | 614 | // Player Movement checked with navigation switch |
michaeljson | 0:3817adfaeb06 | 615 | if (myNav.left() && ((player.player_blk_x-3) > 0)) |
michaeljson | 0:3817adfaeb06 | 616 | { |
michaeljson | 0:3817adfaeb06 | 617 | player_erase(&player); |
michaeljson | 0:3817adfaeb06 | 618 | player.player_blk_x -= 3; |
michaeljson | 0:3817adfaeb06 | 619 | player_show(&player); |
michaeljson | 0:3817adfaeb06 | 620 | } |
michaeljson | 0:3817adfaeb06 | 621 | else if (myNav.right() && ((player.player_blk_x+3) < (128-player.player_width))) |
michaeljson | 0:3817adfaeb06 | 622 | { |
michaeljson | 0:3817adfaeb06 | 623 | player_erase(&player); |
michaeljson | 0:3817adfaeb06 | 624 | player.player_blk_x += 3; |
michaeljson | 0:3817adfaeb06 | 625 | player_show(&player); |
michaeljson | 0:3817adfaeb06 | 626 | } |
michaeljson | 0:3817adfaeb06 | 627 | |
michaeljson | 0:3817adfaeb06 | 628 | // Player Fire |
michaeljson | 0:3817adfaeb06 | 629 | if (pb == 0 && missile.status == PLAYER_MISSILE_INACTIVE) |
michaeljson | 0:3817adfaeb06 | 630 | { |
michaeljson | 0:3817adfaeb06 | 631 | missile.missile_blk_x = player.player_blk_x+(player.player_width/2); |
michaeljson | 0:3817adfaeb06 | 632 | missile.missile_blk_y = player.player_blk_y; |
michaeljson | 0:3817adfaeb06 | 633 | missile.status = PLAYER_MISSILE_ACTIVE; |
michaeljson | 0:3817adfaeb06 | 634 | } |
michaeljson | 0:3817adfaeb06 | 635 | |
michaeljson | 0:3817adfaeb06 | 636 | // checks if player destroyed all enemies |
michaeljson | 0:3817adfaeb06 | 637 | if (numOfEnemies == 0) |
michaeljson | 0:3817adfaeb06 | 638 | { |
michaeljson | 0:3817adfaeb06 | 639 | uLCD.cls(); |
michaeljson | 0:3817adfaeb06 | 640 | |
michaeljson | 0:3817adfaeb06 | 641 | bool win = true; // sets win to true, for win screen |
michaeljson | 0:3817adfaeb06 | 642 | begin_game = false; |
michaeljson | 0:3817adfaeb06 | 643 | |
michaeljson | 0:3817adfaeb06 | 644 | // displays video clip |
michaeljson | 0:3817adfaeb06 | 645 | uLCD.cls(); |
michaeljson | 0:3817adfaeb06 | 646 | uLCD.media_init(); |
michaeljson | 0:3817adfaeb06 | 647 | uLCD.set_sector_address(0x00, 0x00); |
michaeljson | 0:3817adfaeb06 | 648 | uLCD.display_video(0,0); |
michaeljson | 0:3817adfaeb06 | 649 | wait(1); |
michaeljson | 0:3817adfaeb06 | 650 | |
michaeljson | 0:3817adfaeb06 | 651 | uLCD.cls(); |
michaeljson | 0:3817adfaeb06 | 652 | |
michaeljson | 0:3817adfaeb06 | 653 | // prints "Congratulations" on uLCD |
michaeljson | 0:3817adfaeb06 | 654 | uLCD.locate(win_x_pos,win_y_pos); |
michaeljson | 0:3817adfaeb06 | 655 | uLCD.printf("CONGRATULATIONS!"); |
michaeljson | 0:3817adfaeb06 | 656 | |
michaeljson | 0:3817adfaeb06 | 657 | // prints "Play Again?" and "Press pb..." |
michaeljson | 0:3817adfaeb06 | 658 | uLCD.locate(startover_x_pos, startover_y_pos); |
michaeljson | 0:3817adfaeb06 | 659 | uLCD.printf("Play Again?"); |
michaeljson | 0:3817adfaeb06 | 660 | uLCD.locate(startover_x_pos, startover_y_pos+1); |
michaeljson | 0:3817adfaeb06 | 661 | uLCD.printf("Press pb..."); |
michaeljson | 0:3817adfaeb06 | 662 | |
michaeljson | 0:3817adfaeb06 | 663 | // waits at win screen until pushbutton is pressed |
michaeljson | 0:3817adfaeb06 | 664 | while (win) |
michaeljson | 0:3817adfaeb06 | 665 | { |
michaeljson | 0:3817adfaeb06 | 666 | // if pb is pressed, reset game to start menu |
michaeljson | 0:3817adfaeb06 | 667 | if (!pb) |
michaeljson | 0:3817adfaeb06 | 668 | { |
michaeljson | 0:3817adfaeb06 | 669 | win = false; |
michaeljson | 0:3817adfaeb06 | 670 | wait(0.5); |
michaeljson | 0:3817adfaeb06 | 671 | } |
michaeljson | 0:3817adfaeb06 | 672 | } |
michaeljson | 0:3817adfaeb06 | 673 | |
michaeljson | 0:3817adfaeb06 | 674 | } |
michaeljson | 0:3817adfaeb06 | 675 | |
michaeljson | 0:3817adfaeb06 | 676 | // checks if player was hit |
michaeljson | 0:3817adfaeb06 | 677 | if (hit_player) |
michaeljson | 0:3817adfaeb06 | 678 | { |
michaeljson | 0:3817adfaeb06 | 679 | // updates lives |
michaeljson | 0:3817adfaeb06 | 680 | lives -= 1; |
michaeljson | 0:3817adfaeb06 | 681 | wait(0.5); |
michaeljson | 0:3817adfaeb06 | 682 | hit_player = 0; |
michaeljson | 0:3817adfaeb06 | 683 | player_show(&player); |
michaeljson | 0:3817adfaeb06 | 684 | player.status = PLAYER_ALIVE; |
michaeljson | 0:3817adfaeb06 | 685 | |
michaeljson | 0:3817adfaeb06 | 686 | // prints updated lives number |
michaeljson | 0:3817adfaeb06 | 687 | uLCD.locate(0,0); |
michaeljson | 0:3817adfaeb06 | 688 | uLCD.printf("Lives:%i", lives); |
michaeljson | 0:3817adfaeb06 | 689 | } |
michaeljson | 0:3817adfaeb06 | 690 | |
michaeljson | 0:3817adfaeb06 | 691 | // if player loses all lives or enemy reaches the player |
michaeljson | 0:3817adfaeb06 | 692 | if (lose || lives == 0) |
michaeljson | 0:3817adfaeb06 | 693 | { |
michaeljson | 0:3817adfaeb06 | 694 | begin_game = false; // set to false to end game |
michaeljson | 0:3817adfaeb06 | 695 | uLCD.cls(); |
michaeljson | 0:3817adfaeb06 | 696 | |
michaeljson | 0:3817adfaeb06 | 697 | gameover = true; // set to go to display gameover screen |
michaeljson | 0:3817adfaeb06 | 698 | |
michaeljson | 0:3817adfaeb06 | 699 | // prints "GAMEOVER" to uLCD |
michaeljson | 0:3817adfaeb06 | 700 | uLCD.locate(gameover_x_pos, gameover_y_pos); |
michaeljson | 0:3817adfaeb06 | 701 | uLCD.printf("GAMEOVER"); |
michaeljson | 0:3817adfaeb06 | 702 | wait(1); |
michaeljson | 0:3817adfaeb06 | 703 | |
michaeljson | 0:3817adfaeb06 | 704 | // prints "Play Again?" and "Press pb..." |
michaeljson | 0:3817adfaeb06 | 705 | uLCD.locate(startover_x_pos, startover_y_pos); |
michaeljson | 0:3817adfaeb06 | 706 | uLCD.printf("Play Again?"); |
michaeljson | 0:3817adfaeb06 | 707 | uLCD.locate(startover_x_pos, startover_y_pos+1); |
michaeljson | 0:3817adfaeb06 | 708 | uLCD.printf("Press pb..."); |
michaeljson | 0:3817adfaeb06 | 709 | |
michaeljson | 0:3817adfaeb06 | 710 | // stays in gameover screen until pb is pressed |
michaeljson | 0:3817adfaeb06 | 711 | while (gameover) |
michaeljson | 0:3817adfaeb06 | 712 | { |
michaeljson | 0:3817adfaeb06 | 713 | // if pb is pressed, game is reset to the game menu screen |
michaeljson | 0:3817adfaeb06 | 714 | if (!pb) |
michaeljson | 0:3817adfaeb06 | 715 | { |
michaeljson | 0:3817adfaeb06 | 716 | gameover = false; |
michaeljson | 0:3817adfaeb06 | 717 | game_menu = true; |
michaeljson | 0:3817adfaeb06 | 718 | wait(0.5); |
michaeljson | 0:3817adfaeb06 | 719 | } |
michaeljson | 0:3817adfaeb06 | 720 | } |
michaeljson | 0:3817adfaeb06 | 721 | } |
michaeljson | 0:3817adfaeb06 | 722 | |
michaeljson | 0:3817adfaeb06 | 723 | } |
michaeljson | 0:3817adfaeb06 | 724 | } |
michaeljson | 0:3817adfaeb06 | 725 | } |