Michael Son / Mbed 2 deprecated Mbed Space Invaders

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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }