Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
main.cpp
00001 #include "mbed.h" 00002 #include "SDFileSystem.h" 00003 #include "wave_player.h" 00004 #include "enemy.h" 00005 #include "player.h" 00006 #include "missile.h" 00007 #include "globals.h" 00008 #include "rtos.h" 00009 #include <string> 00010 00011 /* ==== Navigation Switch ===== */ 00012 class Nav_Switch 00013 { 00014 public: 00015 Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire); 00016 int read(); 00017 //boolean functions to test each switch 00018 bool up(); 00019 bool down(); 00020 bool left(); 00021 bool right(); 00022 bool fire(); 00023 //automatic read on RHS 00024 operator int (); 00025 //index to any switch array style 00026 bool operator[](int index) { 00027 return _pins[index]; 00028 }; 00029 private: 00030 BusIn _pins; 00031 00032 }; 00033 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire): 00034 _pins(up, down, left, right, fire) 00035 { 00036 _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise 00037 wait(0.001); //delays just a bit for pullups to pull inputs high 00038 } 00039 inline bool Nav_Switch::up() 00040 { 00041 return !(_pins[0]); 00042 } 00043 inline bool Nav_Switch::down() 00044 { 00045 return !(_pins[1]); 00046 } 00047 inline bool Nav_Switch::left() 00048 { 00049 return !(_pins[2]); 00050 } 00051 inline bool Nav_Switch::right() 00052 { 00053 return !(_pins[3]); 00054 } 00055 inline bool Nav_Switch::fire() 00056 { 00057 return !(_pins[4]); 00058 } 00059 inline int Nav_Switch::read() 00060 { 00061 return _pins.read(); 00062 } 00063 inline Nav_Switch::operator int () 00064 { 00065 return _pins.read(); 00066 } 00067 00068 // Platform initialization 00069 uLCD_4DGL uLCD(p28,p27,p29); // LCD (serial tx, serial rx, reset pin;) 00070 AnalogOut DACout(p18); // speaker 00071 wave_player waver(&DACout); // wav player 00072 SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card and filesystem (mosi, miso, sck, cs) 00073 Nav_Switch myNav(p13, p10, p11, p9, p12); //pin order on Sparkfun breakout 00074 DigitalIn pb(p15); // push button for player misisle fire 00075 00076 // Initialize all global enemy objects 00077 enemy_t enemy_1; 00078 enemy_t enemy_2; 00079 enemy_t enemy_3; 00080 enemy_t enemy_4; 00081 enemy_t enemy_5; 00082 enemy_t enemy_6; 00083 enemy_t enemy_7; 00084 enemy_t enemy_8; 00085 enemy_t enemy_9; 00086 enemy_t enemy_10; 00087 enemy_t enemy_11; 00088 enemy_t enemy_12; 00089 enemy_t enemy_13; 00090 enemy_t enemy_14; 00091 enemy_t enemy_15; 00092 00093 // Initialize variables 00094 int numOfEnemies = 0; 00095 int ENEMY_MOVE = 1; 00096 int MOVE_DOWN = 0; 00097 int DIRECTION = 1; 00098 int firing_col = 0; 00099 int hit_player = 0; 00100 bool lose = false; 00101 int lives = 3; 00102 bool game_menu = false; 00103 bool begin_game = false; 00104 bool gameover = false; 00105 00106 // Initialize global player object 00107 player_t player; 00108 00109 // Intialize global player and enemy missile 00110 missile_t missile; // player missile 00111 missile_t enemy_missile; // enemy missile 00112 00113 // Array of enemy objects 00114 enemy_t * enemyArray[15]; 00115 00116 // Function Prototypes 00117 void move_enemy_down(); 00118 void playstart(void const *args); 00119 00120 // Draws the enemies at the initial starting location 00121 void draw_enemies_level() 00122 { 00123 // Initialize local variables 00124 unsigned int start_x_pos = 12; 00125 unsigned int start_enemy_y_pos = 20; 00126 numOfEnemies = 15; 00127 00128 // First Row of Enemies 00129 enemy_init(&enemy_1,start_x_pos,start_enemy_y_pos,WHITE); // initialize x-pos and y-pos and color of enemy 00130 enemy_show(&enemy_1); // displays the enemy on uLCD 00131 00132 enemy_init(&enemy_2,start_x_pos+15,start_enemy_y_pos,WHITE); 00133 enemy_show(&enemy_2); 00134 00135 enemy_init(&enemy_3,start_x_pos+30,start_enemy_y_pos,WHITE); 00136 enemy_show(&enemy_3); 00137 00138 enemy_init(&enemy_4,start_x_pos+45,start_enemy_y_pos,WHITE); 00139 enemy_show(&enemy_4); 00140 00141 enemy_init(&enemy_5,start_x_pos+60,start_enemy_y_pos,WHITE); 00142 enemy_show(&enemy_5); 00143 00144 // Second Row of Enemies 00145 enemy_init(&enemy_6,start_x_pos,start_enemy_y_pos+12,WHITE); 00146 enemy_show(&enemy_6); 00147 00148 enemy_init(&enemy_7,start_x_pos+15,start_enemy_y_pos+12,WHITE); 00149 enemy_show(&enemy_7); 00150 00151 enemy_init(&enemy_8,start_x_pos+30,start_enemy_y_pos+12,WHITE); 00152 enemy_show(&enemy_8); 00153 00154 enemy_init(&enemy_9,start_x_pos+45,start_enemy_y_pos+12,WHITE); 00155 enemy_show(&enemy_9); 00156 00157 enemy_init(&enemy_10,start_x_pos+60,start_enemy_y_pos+12,WHITE); 00158 enemy_show(&enemy_10); 00159 00160 // Third Row of Enemies 00161 enemy_init(&enemy_11,start_x_pos,start_enemy_y_pos+24,WHITE); 00162 enemy_show(&enemy_11); 00163 00164 enemy_init(&enemy_12,start_x_pos+15,start_enemy_y_pos+24,WHITE); 00165 enemy_show(&enemy_12); 00166 00167 enemy_init(&enemy_13,start_x_pos+30,start_enemy_y_pos+24,WHITE); 00168 enemy_show(&enemy_13); 00169 00170 enemy_init(&enemy_14,start_x_pos+45,start_enemy_y_pos+24,WHITE); 00171 enemy_show(&enemy_14); 00172 00173 enemy_init(&enemy_15,start_x_pos+60,start_enemy_y_pos+24,WHITE); 00174 enemy_show(&enemy_15); 00175 00176 // Put enemy objects into array 00177 enemyArray[0] = &enemy_1; 00178 enemyArray[1] = &enemy_2; 00179 enemyArray[2] = &enemy_3; 00180 enemyArray[3] = &enemy_4; 00181 enemyArray[4] = &enemy_5; 00182 enemyArray[5] = &enemy_6; 00183 enemyArray[6] = &enemy_7; 00184 enemyArray[7] = &enemy_8; 00185 enemyArray[8] = &enemy_9; 00186 enemyArray[9] = &enemy_10; 00187 enemyArray[10] = &enemy_11; 00188 enemyArray[11] = &enemy_12; 00189 enemyArray[12] = &enemy_13; 00190 enemyArray[13] = &enemy_14; 00191 enemyArray[14] = &enemy_15; 00192 } 00193 00194 // Draws the player at the initial starting location 00195 void draw_initial_player() 00196 { 00197 int start_x_pos = 59; 00198 int start_y_pos = 110; 00199 00200 player_init(&player,start_x_pos,start_y_pos,WHITE); // intialize x-pos and y-pos and color of player 00201 player_show(&player); // display player on uLCD 00202 } 00203 00204 // Checks all enemies in row 1 00205 void check_hit_enemy_row1() 00206 { 00207 int hit_enemy; 00208 00209 // First Row of Enemies 00210 hit_enemy = check_enemy(&enemy_1, &missile); // checks if the missile hits the enemy and returns 1 if hit, 0 if not hit 00211 numOfEnemies = numOfEnemies - hit_enemy; // updates the number of enemies left 00212 hit_enemy = check_enemy(&enemy_2, &missile); 00213 numOfEnemies = numOfEnemies - hit_enemy; 00214 hit_enemy = check_enemy(&enemy_3, &missile); 00215 numOfEnemies = numOfEnemies - hit_enemy; 00216 hit_enemy = check_enemy(&enemy_4, &missile); 00217 numOfEnemies = numOfEnemies - hit_enemy; 00218 hit_enemy = check_enemy(&enemy_5, &missile); 00219 numOfEnemies = numOfEnemies - hit_enemy; 00220 } 00221 00222 // Same as check_hit_enemy_row1, but checks enemies at row 2 00223 void check_hit_enemy_row2() 00224 { 00225 int hit_enemy; 00226 00227 // Second Row of Enemies 00228 hit_enemy = check_enemy(&enemy_6, &missile); 00229 numOfEnemies = numOfEnemies - hit_enemy; 00230 hit_enemy = check_enemy(&enemy_7, &missile); 00231 numOfEnemies = numOfEnemies - hit_enemy; 00232 hit_enemy = check_enemy(&enemy_8, &missile); 00233 numOfEnemies = numOfEnemies - hit_enemy; 00234 hit_enemy = check_enemy(&enemy_9, &missile); 00235 numOfEnemies = numOfEnemies - hit_enemy; 00236 hit_enemy = check_enemy(&enemy_10, &missile); 00237 numOfEnemies = numOfEnemies - hit_enemy; 00238 } 00239 00240 // Same as check_hit_enemy_row1, but checks enemies at row 3 00241 void check_hit_enemy_row3() 00242 { 00243 int hit_enemy; 00244 00245 // Third Row of Enemies 00246 hit_enemy = check_enemy(&enemy_11, &missile); 00247 numOfEnemies = numOfEnemies - hit_enemy; 00248 hit_enemy = check_enemy(&enemy_12, &missile); 00249 numOfEnemies = numOfEnemies - hit_enemy; 00250 hit_enemy = check_enemy(&enemy_13, &missile); 00251 numOfEnemies = numOfEnemies - hit_enemy; 00252 hit_enemy = check_enemy(&enemy_14, &missile); 00253 numOfEnemies = numOfEnemies - hit_enemy; 00254 hit_enemy = check_enemy(&enemy_15, &missile); 00255 numOfEnemies = numOfEnemies - hit_enemy; 00256 } 00257 00258 // Checks if player is hit 00259 void check_player_hit() 00260 { 00261 hit_player = check_player(&player, &enemy_missile); // checks if the missile hits the player and returns 1 if hit, 0 if not hit 00262 } 00263 00264 // Randomly selects an enemy to fire and updates the position of where the missile will fire from 00265 void random_attack_gen() 00266 { 00267 firing_col = rand() % 5; // selects a random column 00268 00269 // first checks if the 3rd row closest to the player is alive 00270 if (enemyArray[firing_col+10]->status == ENEMY_ALIVE) 00271 { 00272 // If alive, the enemy missile position is updated to the center of the enemy 00273 enemy_missile.missile_blk_x = enemyArray[firing_col+10]->enemy_blk_x + (enemyArray[firing_col+10]->enemy_width/2); 00274 enemy_missile.missile_blk_y = enemyArray[firing_col+10]->enemy_blk_y + enemyArray[firing_col+10]->enemy_height + 1; 00275 enemy_missile.status = ENEMY_MISSILE_ACTIVE; // sets the enemy missile as active 00276 } 00277 // if enemy at 3rd row is dead, checks the enemy in the 2nd row 00278 else if (enemyArray[firing_col+5]->status == ENEMY_ALIVE) 00279 { 00280 // If alive, the enemy missile position is updated to the center of the enemy 00281 enemy_missile.missile_blk_x = enemyArray[firing_col+5]->enemy_blk_x + (enemyArray[firing_col+5]->enemy_width/2); 00282 enemy_missile.missile_blk_y = enemyArray[firing_col+5]->enemy_blk_y + enemyArray[firing_col+5]->enemy_height + 1; 00283 enemy_missile.status = ENEMY_MISSILE_ACTIVE; 00284 } 00285 // if enemy at 2nd and 3rd row is dead, checks the enemy in the 1st row 00286 else if (enemyArray[firing_col]->status == ENEMY_ALIVE) 00287 { 00288 // If alive, the enemy missile position is updated to the center of the enemy 00289 enemy_missile.missile_blk_x = enemyArray[firing_col]->enemy_blk_x + (enemyArray[firing_col]->enemy_width/2); 00290 enemy_missile.missile_blk_y = enemyArray[firing_col]->enemy_blk_y + enemyArray[firing_col]->enemy_height + 1; 00291 enemy_missile.status = ENEMY_MISSILE_ACTIVE; 00292 } 00293 } 00294 00295 // moves the enemy 00296 void enemy_motion() 00297 { 00298 // will move the enemy every 6 loops 00299 if (ENEMY_MOVE % 6 == 0) 00300 { 00301 // FIrst Row of Enemies 00302 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 00303 MOVE_DOWN = move_enemy(&enemy_2, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 1 enemies reach the left or right edge of the screen 00304 MOVE_DOWN = move_enemy(&enemy_3, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 2 if enemies reach the player, otherwise 0 00305 MOVE_DOWN = move_enemy(&enemy_4, MOVE_DOWN, DIRECTION); 00306 MOVE_DOWN = move_enemy(&enemy_5, MOVE_DOWN, DIRECTION); 00307 00308 // Second Row of Enemies 00309 MOVE_DOWN = move_enemy(&enemy_6, MOVE_DOWN, DIRECTION); 00310 MOVE_DOWN = move_enemy(&enemy_7, MOVE_DOWN, DIRECTION); 00311 MOVE_DOWN = move_enemy(&enemy_8, MOVE_DOWN, DIRECTION); 00312 MOVE_DOWN = move_enemy(&enemy_9, MOVE_DOWN, DIRECTION); 00313 MOVE_DOWN = move_enemy(&enemy_10, MOVE_DOWN, DIRECTION); 00314 00315 // Third Row of Enemies 00316 MOVE_DOWN = move_enemy(&enemy_11, MOVE_DOWN, DIRECTION); 00317 MOVE_DOWN = move_enemy(&enemy_12, MOVE_DOWN, DIRECTION); 00318 MOVE_DOWN = move_enemy(&enemy_13, MOVE_DOWN, DIRECTION); 00319 MOVE_DOWN = move_enemy(&enemy_14, MOVE_DOWN, DIRECTION); 00320 MOVE_DOWN = move_enemy(&enemy_15, MOVE_DOWN, DIRECTION); 00321 00322 // if MOVE_DOWN is 2, then the enemies have reached the player 00323 if (MOVE_DOWN == 2) 00324 { 00325 lose = true; // set global lose to true to go to gameover screen 00326 } 00327 00328 // if MOVE_DOWN is 1, update the y-pos of the enemies 00329 if (MOVE_DOWN == 1) 00330 { 00331 move_enemy_down(); // updates the y-pos of the enemies 00332 00333 // Flips the direction when the enemy moves down 00334 if (DIRECTION == 1) 00335 { 00336 DIRECTION = 2; 00337 } 00338 else 00339 { 00340 DIRECTION = 1; 00341 } 00342 MOVE_DOWN = 0; // sets MOVE_DOWN back to 0 to stop down movement until 00343 } 00344 00345 ENEMY_MOVE += 1; 00346 } 00347 else 00348 { 00349 ENEMY_MOVE += 1; 00350 } 00351 } 00352 00353 // moves all the enemies down in the y-direction 00354 void move_enemy_down() 00355 { 00356 // First Row of Enemies 00357 enemy_erase(&enemy_1); 00358 enemy_erase(&enemy_2); 00359 enemy_erase(&enemy_3); 00360 enemy_erase(&enemy_4); 00361 enemy_erase(&enemy_5); 00362 00363 enemy_1.enemy_blk_y += enemy_1.enemy_height+4; 00364 enemy_2.enemy_blk_y += enemy_2.enemy_height+4; 00365 enemy_3.enemy_blk_y += enemy_3.enemy_height+4; 00366 enemy_4.enemy_blk_y += enemy_4.enemy_height+4; 00367 enemy_5.enemy_blk_y += enemy_5.enemy_height+4; 00368 00369 // Second Row of Enemies 00370 enemy_erase(&enemy_6); 00371 enemy_erase(&enemy_7); 00372 enemy_erase(&enemy_8); 00373 enemy_erase(&enemy_9); 00374 enemy_erase(&enemy_10); 00375 00376 enemy_6.enemy_blk_y += enemy_6.enemy_height+4; 00377 enemy_7.enemy_blk_y += enemy_7.enemy_height+4; 00378 enemy_8.enemy_blk_y += enemy_8.enemy_height+4; 00379 enemy_9.enemy_blk_y += enemy_9.enemy_height+4; 00380 enemy_10.enemy_blk_y += enemy_10.enemy_height+4; 00381 00382 // Third Row of Enemies 00383 enemy_erase(&enemy_11); 00384 enemy_erase(&enemy_12); 00385 enemy_erase(&enemy_13); 00386 enemy_erase(&enemy_14); 00387 enemy_erase(&enemy_15); 00388 00389 enemy_11.enemy_blk_y += enemy_11.enemy_height+4; 00390 enemy_12.enemy_blk_y += enemy_12.enemy_height+4; 00391 enemy_13.enemy_blk_y += enemy_13.enemy_height+4; 00392 enemy_14.enemy_blk_y += enemy_14.enemy_height+4; 00393 enemy_15.enemy_blk_y += enemy_15.enemy_height+4; 00394 } 00395 00396 // thread that plays sounds during game 00397 void playstart(void const *args)//Th 00398 { //Depending on the state of the game, 00399 //queue either screen music or play sound effect upon fire 00400 while(true) { 00401 FILE *wave_file; 00402 00403 // plays intro music during menu screen 00404 while(game_menu) 00405 { 00406 wave_file=fopen("/sd/wavfiles/spacey_sound.wav","r"); 00407 00408 waver.play(wave_file); 00409 fclose(wave_file); 00410 } 00411 00412 // Checks in game sound conditions 00413 while(begin_game) 00414 { 00415 // play firing sound when the player fires 00416 if(!pb && missile.status == PLAYER_MISSILE_INACTIVE) { 00417 00418 wave_file=fopen("/sd/wavfiles/4.wav","r"); 00419 00420 00421 waver.play(wave_file); 00422 fclose(wave_file); 00423 } 00424 00425 // if player hit, play hit sound 00426 if (hit_player) 00427 { 00428 wave_file=fopen("/sd/wavfiles/1.wav","r"); 00429 00430 waver.play(wave_file); 00431 fclose(wave_file); 00432 } 00433 } 00434 00435 // players gameover voice if player loses 00436 while(gameover) 00437 { 00438 wave_file=fopen("/sd/wavfiles/game_over.wav","r"); 00439 00440 waver.play(wave_file); 00441 fclose(wave_file); 00442 } 00443 } 00444 } 00445 00446 int main() { 00447 00448 // Initialization of Setup variables 00449 int blk_x, blk_y; 00450 pb.mode(PullUp); 00451 00452 Thread thread(playstart); // intializes the thread to play sound 00453 00454 uLCD.baudrate(500000); // set to 500000 to increase smooth gameplay 00455 00456 // Initialization of Game Menu variables 00457 const int title_x_pos = 2; // initial x-pos of title 00458 const int title_y_pos = 3; // initial y-pos of title 00459 int start_label_x_pos = 7; // start label x-pos 00460 int start_label_y_pos = 7; // start label y-pos 00461 int level_cursor_x_pos = 5; // level cursor x-position 00462 int level_cursor_y_pos = 7; // level cursor y-position 00463 int gameover_x_pos = 5; // gameover label x-position 00464 int gameover_y_pos = 5; // gameover label y-position 00465 int win_x_pos = 2; // congratulations label x-position 00466 int win_y_pos = 5; // congratulations label y-position 00467 int startover_x_pos = 3; // startover label x-position 00468 int startover_y_pos = 8; // startover label y-position 00469 00470 // intialize temporary score and current score 00471 int temp = 0; 00472 int score = 0; 00473 00474 // Begin game loop 00475 while(1) 00476 { 00477 // initialize all starting conditions for the beginning of the game 00478 game_menu = true; // defaults to display menu screen 00479 ENEMY_MOVE = true; // defaults to move enemy 00480 DIRECTION = 1; // default to move right 00481 hit_player = 0; // default to not player hit 00482 MOVE_DOWN = 0; // default to not move down 00483 lose = false; // default to not lose 00484 lives = 3; // defaults to 3 lives 00485 score = 0; // default to score of 0 00486 00487 uLCD.cls(); 00488 00489 // Implementation of Game Menu 00490 while(game_menu) 00491 { 00492 uLCD.locate(level_cursor_x_pos,level_cursor_y_pos); // draws cursor next to "START" label 00493 uLCD.printf("->"); 00494 00495 uLCD.locate(title_x_pos,title_y_pos); // "SPACE INVADERS" title position 00496 uLCD.printf("SPACE INVADERS"); // Title 00497 00498 uLCD.locate(start_label_x_pos,start_label_y_pos); // "START" label position 00499 uLCD.printf("START"); 00500 00501 // if pushbutton is pressed, game menu is exited and game begins 00502 if(!pb) 00503 { 00504 game_menu = false; 00505 wait(0.5); 00506 } 00507 } 00508 00509 begin_game = true; // defaults begin_game to true 00510 00511 uLCD.cls(); 00512 00513 // Draw the enemies 00514 draw_enemies_level(); 00515 00516 // Draw the player 00517 draw_initial_player(); 00518 00519 // sets the initial position of player missile and enemy missile (later updated) 00520 blk_x = player.player_blk_x+(player.player_width/2); 00521 blk_y = player.player_blk_y; 00522 missile_init(&missile, blk_x, blk_y, WHITE); 00523 int e_blk_x = 0; 00524 int e_blk_y = 2; 00525 enemy_missile_init(&enemy_missile, e_blk_x, e_blk_y, WHITE); 00526 00527 // prints lives 00528 uLCD.locate(0,0); 00529 uLCD.printf("Lives:%i", lives); 00530 00531 // prints score 00532 uLCD.locate(9,0); 00533 uLCD.printf("Score:%i", score); 00534 00535 // game play loop 00536 while(begin_game) 00537 { 00538 // updates score 00539 temp = score; 00540 score = (15-numOfEnemies)*15; 00541 00542 // prints score if score changes 00543 if (score != temp) 00544 { 00545 uLCD.locate(9,0); 00546 uLCD.printf("Score:%i", score); 00547 } 00548 00549 // move enemy 00550 enemy_motion(); 00551 00552 // checks if player missile passes y-pos of row1 00553 if (missile.missile_blk_y+1-missile.missile_height <= enemy_1.enemy_blk_y 00554 && missile.missile_blk_y+1-missile.missile_height >= enemy_1.enemy_blk_y-enemy_1.enemy_height) 00555 { 00556 check_hit_enemy_row1(); 00557 } 00558 00559 // checks if player missile passes y-pos of row2 00560 if (missile.missile_blk_y+1-missile.missile_height <= enemy_6.enemy_blk_y 00561 && missile.missile_blk_y+1-missile.missile_height >= enemy_6.enemy_blk_y-enemy_6.enemy_height) 00562 { 00563 check_hit_enemy_row2(); 00564 } 00565 00566 // checks if player missile passes y-pos of row3 00567 if (missile.missile_blk_y+1-missile.missile_height <= enemy_11.enemy_blk_y 00568 && missile.missile_blk_y+1-missile.missile_height >= enemy_11.enemy_blk_y-enemy_11.enemy_height) 00569 { 00570 check_hit_enemy_row3(); 00571 } 00572 00573 // Random Enemy Fire 00574 if (enemy_missile.status == ENEMY_MISSILE_INACTIVE) 00575 { 00576 random_attack_gen(); 00577 } 00578 00579 // checks if enemy missile passes y-pos of player 00580 if (enemy_missile.missile_blk_y >= player.player_blk_y 00581 && enemy_missile.missile_blk_y <= player.player_blk_y+player.player_height) 00582 { 00583 check_player_hit(); 00584 } 00585 00586 update_missile_pos(&missile); // updates player missile position 00587 update_enemy_missile_pos(&enemy_missile); // updates enemy missile position 00588 00589 // Player Movement checked with navigation switch 00590 if (myNav.left() && ((player.player_blk_x-3) > 0)) 00591 { 00592 player_erase(&player); 00593 player.player_blk_x -= 3; 00594 player_show(&player); 00595 } 00596 else if (myNav.right() && ((player.player_blk_x+3) < (128-player.player_width))) 00597 { 00598 player_erase(&player); 00599 player.player_blk_x += 3; 00600 player_show(&player); 00601 } 00602 00603 // Player Fire 00604 if (pb == 0 && missile.status == PLAYER_MISSILE_INACTIVE) 00605 { 00606 missile.missile_blk_x = player.player_blk_x+(player.player_width/2); 00607 missile.missile_blk_y = player.player_blk_y; 00608 missile.status = PLAYER_MISSILE_ACTIVE; 00609 } 00610 00611 // checks if player destroyed all enemies 00612 if (numOfEnemies == 0) 00613 { 00614 uLCD.cls(); 00615 00616 bool win = true; // sets win to true, for win screen 00617 begin_game = false; 00618 00619 // displays video clip 00620 uLCD.cls(); 00621 uLCD.media_init(); 00622 uLCD.set_sector_address(0x00, 0x00); 00623 uLCD.display_video(0,0); 00624 wait(1); 00625 00626 uLCD.cls(); 00627 00628 // prints "Congratulations" on uLCD 00629 uLCD.locate(win_x_pos,win_y_pos); 00630 uLCD.printf("CONGRATULATIONS!"); 00631 00632 // prints "Play Again?" and "Press pb..." 00633 uLCD.locate(startover_x_pos, startover_y_pos); 00634 uLCD.printf("Play Again?"); 00635 uLCD.locate(startover_x_pos, startover_y_pos+1); 00636 uLCD.printf("Press pb..."); 00637 00638 // waits at win screen until pushbutton is pressed 00639 while (win) 00640 { 00641 // if pb is pressed, reset game to start menu 00642 if (!pb) 00643 { 00644 win = false; 00645 wait(0.5); 00646 } 00647 } 00648 00649 } 00650 00651 // checks if player was hit 00652 if (hit_player) 00653 { 00654 // updates lives 00655 lives -= 1; 00656 wait(0.5); 00657 hit_player = 0; 00658 player_show(&player); 00659 player.status = PLAYER_ALIVE; 00660 00661 // prints updated lives number 00662 uLCD.locate(0,0); 00663 uLCD.printf("Lives:%i", lives); 00664 } 00665 00666 // if player loses all lives or enemy reaches the player 00667 if (lose || lives == 0) 00668 { 00669 begin_game = false; // set to false to end game 00670 uLCD.cls(); 00671 00672 gameover = true; // set to go to display gameover screen 00673 00674 // prints "GAMEOVER" to uLCD 00675 uLCD.locate(gameover_x_pos, gameover_y_pos); 00676 uLCD.printf("GAMEOVER"); 00677 wait(1); 00678 00679 // prints "Play Again?" and "Press pb..." 00680 uLCD.locate(startover_x_pos, startover_y_pos); 00681 uLCD.printf("Play Again?"); 00682 uLCD.locate(startover_x_pos, startover_y_pos+1); 00683 uLCD.printf("Press pb..."); 00684 00685 // stays in gameover screen until pb is pressed 00686 while (gameover) 00687 { 00688 // if pb is pressed, game is reset to the game menu screen 00689 if (!pb) 00690 { 00691 gameover = false; 00692 game_menu = true; 00693 wait(0.5); 00694 } 00695 } 00696 } 00697 00698 } 00699 } 00700 }
Generated on Tue Jul 12 2022 19:28:40 by
1.7.2