ECE 4180 Single Player Space Invaders Team / Mbed 2 deprecated Mbed-Space-Invaders4

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

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 #include "LSM9DS1.h"
00011 
00012 /* ==== Navigation Switch ===== */
00013 
00014 
00015 // Platform initialization
00016 
00017 uLCD_4DGL uLCD(p28,p27,p29); // LCD (serial tx, serial rx, reset pin;)
00018 AnalogOut DACout(p18);      // speaker
00019 wave_player waver(&DACout); // wav player
00020 SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card and filesystem (mosi, miso, sck, cs)
00021 //Nav_Switch myNav(p16, p10, p11, p9, p12); //pin order on Sparkfun breakout
00022 DigitalIn pb(p15); // push button for player misisle fir
00023 Serial pc(USBTX, USBRX);
00024 PwmOut red(p21); // added to dim and brighten red LED -- Brice
00025 PwmOut green(p22); // added to dim and brighten green LED -- Brice
00026 PwmOut blue(p23); // added to dim and brighten blue LED -- Brice
00027 
00028 // Initialize all global enemy objects
00029 enemy_t enemy_1;
00030 enemy_t enemy_2;
00031 enemy_t enemy_3;
00032 enemy_t enemy_4;
00033 enemy_t enemy_5;
00034 enemy_t enemy_6;
00035 enemy_t enemy_7;
00036 enemy_t enemy_8;
00037 enemy_t enemy_9;
00038 enemy_t enemy_10;
00039 enemy_t enemy_11;
00040 enemy_t enemy_12;
00041 enemy_t enemy_13;
00042 enemy_t enemy_14;
00043 enemy_t enemy_15;
00044 
00045 // Initialize variables
00046 int numOfEnemies = 0;
00047 int ENEMY_MOVE = 1; 
00048 int MOVE_DOWN = 0;
00049 int DIRECTION = 1;
00050 int firing_col = 0;
00051 int hit_player = 0;
00052 bool lose = false;
00053 int lives1 = 3;
00054 int lives2 = 2;
00055 int lives3 = 1;
00056 //int max_lives = 3;
00057 bool game_menu = false;
00058 bool begin_game = false;
00059 bool gameover = false;
00060 int level = 1;
00061  double inX,inY,inZ;
00062   int pos = 0;
00063 
00064 // Initialize global player object
00065 player_t player;
00066 
00067 // Intialize global player and enemy missile
00068 missile_t missile; // player missile
00069 missile_t enemy_missile; // enemy missile
00070 
00071 // Array of enemy objects
00072 enemy_t * enemyArray[15];
00073 
00074 // Function Prototypes
00075 void move_enemy_down();
00076 void playstart(void const *args);
00077 
00078 // Draws the enemies at the initial starting location    
00079 void draw_enemies_level()
00080 {
00081     // Initialize local variables
00082     unsigned int start_x_pos = 12;
00083     unsigned int start_enemy_y_pos = 20; 
00084     numOfEnemies = 15;
00085     
00086     // First Row of Enemies
00087     enemy_init(&enemy_1,start_x_pos,start_enemy_y_pos,WHITE); // initialize x-pos and y-pos and color of enemy
00088     enemy_show(&enemy_1); // displays the enemy on uLCD
00089     
00090     enemy_init(&enemy_2,start_x_pos+15,start_enemy_y_pos,WHITE);
00091     enemy_show(&enemy_2);
00092     
00093     enemy_init(&enemy_3,start_x_pos+30,start_enemy_y_pos,WHITE);
00094     enemy_show(&enemy_3);
00095     
00096     enemy_init(&enemy_4,start_x_pos+45,start_enemy_y_pos,WHITE);
00097     enemy_show(&enemy_4);
00098     
00099     enemy_init(&enemy_5,start_x_pos+60,start_enemy_y_pos,WHITE);
00100     enemy_show(&enemy_5);
00101     
00102     // Second Row of Enemies
00103     enemy_init(&enemy_6,start_x_pos,start_enemy_y_pos+12,WHITE);
00104     enemy_show(&enemy_6);
00105     
00106     enemy_init(&enemy_7,start_x_pos+15,start_enemy_y_pos+12,WHITE);
00107     enemy_show(&enemy_7);
00108     
00109     enemy_init(&enemy_8,start_x_pos+30,start_enemy_y_pos+12,WHITE);
00110     enemy_show(&enemy_8);
00111     
00112     enemy_init(&enemy_9,start_x_pos+45,start_enemy_y_pos+12,WHITE);
00113     enemy_show(&enemy_9);
00114     
00115     enemy_init(&enemy_10,start_x_pos+60,start_enemy_y_pos+12,WHITE);
00116     enemy_show(&enemy_10);
00117     
00118     // Third Row of Enemies
00119     enemy_init(&enemy_11,start_x_pos,start_enemy_y_pos+24,WHITE);
00120     enemy_show(&enemy_11);
00121     
00122     enemy_init(&enemy_12,start_x_pos+15,start_enemy_y_pos+24,WHITE);
00123     enemy_show(&enemy_12);
00124     
00125     enemy_init(&enemy_13,start_x_pos+30,start_enemy_y_pos+24,WHITE);
00126     enemy_show(&enemy_13);
00127     
00128     enemy_init(&enemy_14,start_x_pos+45,start_enemy_y_pos+24,WHITE);
00129     enemy_show(&enemy_14);
00130     
00131     enemy_init(&enemy_15,start_x_pos+60,start_enemy_y_pos+24,WHITE);
00132     enemy_show(&enemy_15);
00133     
00134     // Put enemy objects into array
00135     enemyArray[0] = &enemy_1;
00136     enemyArray[1] = &enemy_2;
00137     enemyArray[2] = &enemy_3;
00138     enemyArray[3] = &enemy_4;
00139     enemyArray[4] = &enemy_5;
00140     enemyArray[5] = &enemy_6;
00141     enemyArray[6] = &enemy_7;
00142     enemyArray[7] = &enemy_8;
00143     enemyArray[8] = &enemy_9;
00144     enemyArray[9] = &enemy_10;
00145     enemyArray[10] = &enemy_11;
00146     enemyArray[11] = &enemy_12;
00147     enemyArray[12] = &enemy_13;
00148     enemyArray[13] = &enemy_14;
00149     enemyArray[14] = &enemy_15;
00150 }
00151 
00152 // Draws the player at the initial starting location
00153 void draw_initial_player()
00154 {
00155     int start_x_pos = 59;
00156     int start_y_pos = 110;
00157     
00158     player_init(&player,start_x_pos,start_y_pos,WHITE); // intialize x-pos and y-pos and color of player
00159     player_show(&player); // display player on uLCD
00160 }
00161 
00162 // Checks all enemies in row 1
00163 void check_hit_enemy_row1()
00164 {
00165     int hit_enemy;
00166     
00167     // First Row of Enemies
00168     hit_enemy = check_enemy(&enemy_1, &missile); // checks if the missile hits the enemy and returns 1 if hit, 0 if not hit
00169     numOfEnemies = numOfEnemies - hit_enemy; // updates the number of enemies left
00170     hit_enemy = check_enemy(&enemy_2, &missile);
00171     numOfEnemies = numOfEnemies - hit_enemy;
00172     hit_enemy = check_enemy(&enemy_3, &missile);
00173     numOfEnemies = numOfEnemies - hit_enemy;
00174     hit_enemy = check_enemy(&enemy_4, &missile);
00175     numOfEnemies = numOfEnemies - hit_enemy;
00176     hit_enemy = check_enemy(&enemy_5, &missile);
00177     numOfEnemies = numOfEnemies - hit_enemy;
00178 }
00179 
00180 // Same as check_hit_enemy_row1, but checks enemies at row 2
00181 void check_hit_enemy_row2()
00182 {
00183     int hit_enemy;
00184     
00185     // Second Row of Enemies
00186     hit_enemy = check_enemy(&enemy_6, &missile);
00187     numOfEnemies = numOfEnemies - hit_enemy;
00188     hit_enemy = check_enemy(&enemy_7, &missile);
00189     numOfEnemies = numOfEnemies - hit_enemy;
00190     hit_enemy = check_enemy(&enemy_8, &missile);
00191     numOfEnemies = numOfEnemies - hit_enemy;
00192     hit_enemy = check_enemy(&enemy_9, &missile);
00193     numOfEnemies = numOfEnemies - hit_enemy;
00194     hit_enemy = check_enemy(&enemy_10, &missile);
00195     numOfEnemies = numOfEnemies - hit_enemy;
00196 }
00197 
00198 // Same as check_hit_enemy_row1, but checks enemies at row 3
00199 void check_hit_enemy_row3()
00200 {
00201     int hit_enemy;
00202 
00203     // Third Row of Enemies
00204     hit_enemy = check_enemy(&enemy_11, &missile);
00205     numOfEnemies = numOfEnemies - hit_enemy;
00206     hit_enemy = check_enemy(&enemy_12, &missile);
00207     numOfEnemies = numOfEnemies - hit_enemy;
00208     hit_enemy = check_enemy(&enemy_13, &missile);
00209     numOfEnemies = numOfEnemies - hit_enemy;
00210     hit_enemy = check_enemy(&enemy_14, &missile);
00211     numOfEnemies = numOfEnemies - hit_enemy;
00212     hit_enemy = check_enemy(&enemy_15, &missile);
00213     numOfEnemies = numOfEnemies - hit_enemy;
00214 }
00215 
00216 // Checks if player is hit
00217 void check_player_hit()
00218 {    
00219     hit_player = check_player(&player, &enemy_missile); // checks if the missile hits the player and returns 1 if hit, 0 if not hit
00220 }
00221 
00222 // Randomly selects an enemy to fire and updates the position of where the missile will fire from
00223 void random_attack_gen()
00224 {
00225     firing_col = rand() % 5; // selects a random column
00226     
00227     // first checks if the 3rd row closest to the player is alive
00228     if (enemyArray[firing_col+10]->status == ENEMY_ALIVE)
00229     {
00230         // If alive, the enemy missile position is updated to the center of the enemy
00231         enemy_missile.missile_blk_x = enemyArray[firing_col+10]->enemy_blk_x + (enemyArray[firing_col+10]->enemy_width/2);
00232         enemy_missile.missile_blk_y = enemyArray[firing_col+10]->enemy_blk_y + enemyArray[firing_col+10]->enemy_height + 1;
00233         enemy_missile.status = ENEMY_MISSILE_ACTIVE; // sets the enemy missile as active
00234     }
00235     // if enemy at 3rd row is dead, checks the enemy in the 2nd row
00236     else if (enemyArray[firing_col+5]->status == ENEMY_ALIVE)
00237     {
00238         // If alive, the enemy missile position is updated to the center of the enemy
00239         enemy_missile.missile_blk_x = enemyArray[firing_col+5]->enemy_blk_x + (enemyArray[firing_col+5]->enemy_width/2);
00240         enemy_missile.missile_blk_y = enemyArray[firing_col+5]->enemy_blk_y + enemyArray[firing_col+5]->enemy_height + 1;
00241         enemy_missile.status = ENEMY_MISSILE_ACTIVE;
00242     }
00243     // if enemy at 2nd and 3rd row is dead, checks the enemy in the 1st row
00244     else if (enemyArray[firing_col]->status == ENEMY_ALIVE)
00245     {
00246         // If alive, the enemy missile position is updated to the center of the enemy
00247         enemy_missile.missile_blk_x = enemyArray[firing_col]->enemy_blk_x + (enemyArray[firing_col]->enemy_width/2);
00248         enemy_missile.missile_blk_y = enemyArray[firing_col]->enemy_blk_y + enemyArray[firing_col]->enemy_height + 1;
00249         enemy_missile.status = ENEMY_MISSILE_ACTIVE;
00250     }
00251 }
00252 
00253 // moves the enemy
00254 void enemy_motion()
00255 {
00256     // will move the enemy every 6 loops
00257     if (ENEMY_MOVE % 6 == 0)
00258     {
00259         // FIrst Row of Enemies
00260         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
00261         MOVE_DOWN = move_enemy(&enemy_2, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 1 enemies reach the left or right edge of the screen
00262         MOVE_DOWN = move_enemy(&enemy_3, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 2 if enemies reach the player, otherwise 0
00263         MOVE_DOWN = move_enemy(&enemy_4, MOVE_DOWN, DIRECTION);
00264         MOVE_DOWN = move_enemy(&enemy_5, MOVE_DOWN, DIRECTION); 
00265         
00266         // Second Row of Enemies
00267         MOVE_DOWN = move_enemy(&enemy_6, MOVE_DOWN, DIRECTION);
00268         MOVE_DOWN = move_enemy(&enemy_7, MOVE_DOWN, DIRECTION);
00269         MOVE_DOWN = move_enemy(&enemy_8, MOVE_DOWN, DIRECTION);
00270         MOVE_DOWN = move_enemy(&enemy_9, MOVE_DOWN, DIRECTION);
00271         MOVE_DOWN = move_enemy(&enemy_10, MOVE_DOWN, DIRECTION);
00272         
00273         // Third Row of Enemies
00274         MOVE_DOWN = move_enemy(&enemy_11, MOVE_DOWN, DIRECTION);
00275         MOVE_DOWN = move_enemy(&enemy_12, MOVE_DOWN, DIRECTION);
00276         MOVE_DOWN = move_enemy(&enemy_13, MOVE_DOWN, DIRECTION);
00277         MOVE_DOWN = move_enemy(&enemy_14, MOVE_DOWN, DIRECTION);
00278         MOVE_DOWN = move_enemy(&enemy_15, MOVE_DOWN, DIRECTION);
00279         
00280         // if MOVE_DOWN is 2, then the enemies have reached the player
00281         if (MOVE_DOWN == 2)
00282         {
00283             lose = true; // set global lose to true to go to gameover screen
00284         }
00285         
00286         // if MOVE_DOWN is 1, update the y-pos of the enemies
00287         if (MOVE_DOWN == 1)
00288         {
00289             move_enemy_down(); // updates the y-pos of the enemies
00290             
00291             // Flips the direction when the enemy moves down
00292             if (DIRECTION == 1)
00293             {
00294                 DIRECTION = 2;
00295             }
00296             else
00297             {
00298                 DIRECTION = 1;
00299             }
00300             MOVE_DOWN = 0; // sets MOVE_DOWN back to 0 to stop down movement until 
00301         }  
00302         
00303         ENEMY_MOVE += 1;
00304     }
00305     else
00306     {
00307         ENEMY_MOVE += 1;
00308     }
00309 }
00310 
00311 // moves all the enemies down in the y-direction
00312 void move_enemy_down()
00313 {
00314     // First Row of Enemies
00315     enemy_erase(&enemy_1);
00316     enemy_erase(&enemy_2);
00317     enemy_erase(&enemy_3);
00318     enemy_erase(&enemy_4);
00319     enemy_erase(&enemy_5);
00320     
00321     enemy_1.enemy_blk_y += enemy_1.enemy_height+4;
00322     enemy_2.enemy_blk_y += enemy_2.enemy_height+4;
00323     enemy_3.enemy_blk_y += enemy_3.enemy_height+4;
00324     enemy_4.enemy_blk_y += enemy_4.enemy_height+4;
00325     enemy_5.enemy_blk_y += enemy_5.enemy_height+4;
00326     
00327     // Second Row of Enemies
00328     enemy_erase(&enemy_6);
00329     enemy_erase(&enemy_7);
00330     enemy_erase(&enemy_8);
00331     enemy_erase(&enemy_9);
00332     enemy_erase(&enemy_10);
00333     
00334     enemy_6.enemy_blk_y += enemy_6.enemy_height+4;
00335     enemy_7.enemy_blk_y += enemy_7.enemy_height+4;
00336     enemy_8.enemy_blk_y += enemy_8.enemy_height+4;
00337     enemy_9.enemy_blk_y += enemy_9.enemy_height+4;
00338     enemy_10.enemy_blk_y += enemy_10.enemy_height+4;
00339     
00340     // Third Row of Enemies
00341     enemy_erase(&enemy_11);
00342     enemy_erase(&enemy_12);
00343     enemy_erase(&enemy_13);
00344     enemy_erase(&enemy_14);
00345     enemy_erase(&enemy_15);
00346     
00347     enemy_11.enemy_blk_y += enemy_11.enemy_height+4;
00348     enemy_12.enemy_blk_y += enemy_12.enemy_height+4;
00349     enemy_13.enemy_blk_y += enemy_13.enemy_height+4;
00350     enemy_14.enemy_blk_y += enemy_14.enemy_height+4;
00351     enemy_15.enemy_blk_y += enemy_15.enemy_height+4;
00352 }
00353 /*
00354 // thread that plays sounds during game
00355 void playstart(void const *args)//Th
00356 {   //Depending on the state of the game,
00357     //queue either screen music or play sound effect upon fire
00358     while(true) {
00359         FILE *wave_file;
00360         
00361         // plays intro music during menu screen
00362         while(game_menu)
00363         {
00364             wave_file=fopen("/sd/wavfiles/spacey_sound.wav","r");
00365                 
00366             waver.play(wave_file);
00367             fclose(wave_file);
00368         }
00369         
00370         // Checks in game sound conditions
00371         while(begin_game) 
00372         {
00373             // play firing sound when the player fires
00374             if(!pb && missile.status == PLAYER_MISSILE_INACTIVE) {
00375  
00376                 wave_file=fopen("/sd/wavfiles/4.wav","r");
00377  
00378  
00379                 waver.play(wave_file);
00380                 fclose(wave_file);
00381             }
00382             
00383             // if player hit, play hit sound
00384             if (hit_player)
00385             {
00386                 wave_file=fopen("/sd/wavfiles/1.wav","r");
00387                 
00388                 waver.play(wave_file);
00389                 fclose(wave_file);
00390             }
00391         }
00392         
00393         // players gameover voice if player loses
00394         while(gameover)
00395         {
00396             wave_file=fopen("/sd/wavfiles/game_over.wav","r");
00397             
00398             waver.play(wave_file);
00399             fclose(wave_file);
00400         }
00401     }
00402 }
00403 */
00404 
00405 void ledEffects(void const *args)//Th
00406 {   //Depending on the state of the game,
00407     //generate different patterns/colors of lighting
00408     while(1) {
00409         // gradually increases and decreases each color independently. (A chill build up effect?)
00410         while(game_menu)
00411         {
00412             red = 0.0;
00413             green = 0.0;
00414             blue = 0.0;
00415             for (float i = 0.0; i < 0.5; i = i + 0.05) {
00416                 red = i;
00417                 Thread::wait(10);
00418             }
00419             red = 0.5;
00420             Thread::wait(300);
00421             for (float i = 0.5; i > 0.0; i = i - 0.05) {
00422                 red = i;
00423                 Thread::wait(10);
00424             }
00425             red = 0.0;
00426             for (float i = 0.0; i < 0.25; i = i + 0.05) {
00427                 green = i;
00428                 Thread::wait(10);
00429             }
00430             green = 0.25;
00431             Thread::wait(300);
00432             for (float i = 0.25; i > 0.0; i = i - 0.05) {
00433                 green = i;
00434                 Thread::wait(10);
00435             }
00436             green = 0.0;
00437             for (float i = 0.0; i < 0.5; i = i + 0.05) {
00438                 blue = i;
00439                 Thread::wait(10);
00440             }
00441             blue = 0.5;
00442             Thread::wait(300);
00443             for (float i = 0.5; i > 0.0; i = i - 0.05) {
00444                 blue = i;
00445                 Thread::wait(10);
00446             }
00447             blue = 0.0;
00448         }
00449         // Checks in game sound conditions
00450         while(begin_game) // added OR begin_game2 so that music/sounds play during one-player or two-player 
00451         {
00452             // play firing sound when the player fires
00453             if(!pb && missile.status == PLAYER_MISSILE_INACTIVE) {
00454                 red = 0.0;
00455                 green = 0.0;
00456                 blue = 0.0;
00457                 red = 0.5;
00458                 Thread::wait(200);
00459                 green = 0.15;
00460                 Thread::wait(200);
00461                 red = 0.0;
00462                 green = 0.0;
00463             }
00464             
00465             // if player hit, play hit sound
00466             if (hit_player)
00467             {
00468                 red = 0.0;
00469                 green = 0.0;
00470                 blue = 0.0;
00471                 red = 0.5;
00472                 Thread::wait(60);
00473                 red = 0.0;
00474                 Thread::wait(60);
00475                 red = 0.5;
00476                 Thread::wait(60);
00477                 red = 0.0;
00478                 Thread::wait(60);
00479                 red = 0.5;
00480                 Thread::wait(60);
00481                 red = 0.0;
00482             }
00483             Thread::wait(500);
00484         }
00485         
00486         // players gameover voice if player loses
00487         while(gameover)
00488         {
00489             for (float i = 0.0; i < 0.25; i = i + 0.05) {
00490                 red = i;
00491                 Thread::wait(10);
00492             }
00493             red = 0.25;
00494             Thread::wait(300);
00495             for (float i = 0.25; i > 0.0; i = i - 0.05) {
00496                 red = i;
00497                 Thread::wait(10);
00498             }
00499             red = 0.0;
00500             Thread::wait(500);
00501         }
00502     }
00503 }
00504 
00505 
00506 
00507 
00508 int main() {
00509       LSM9DS1 lol(p9, p10, 0xD6, 0x3C);
00510      // Initialization of Setup variables
00511      int blk_x, blk_y;
00512      pb.mode(PullUp);
00513      lol.begin();
00514     if (!lol.begin()) {
00515         pc.printf("Failed to communicate with LSM9DS1.\n");
00516     }
00517     lol.calibrate();
00518     // Thread thread(playstart); // intializes the thread to play sound
00519         Thread thread2(ledEffects);
00520      uLCD.baudrate(500000); // set to 500000 to increase smooth gameplay
00521      
00522      
00523      // Initialization of Game Menu variables
00524      
00525     const int title_x_pos = 2; // initial x-pos of title
00526     const int title_y_pos = 3; // initial y-pos of title
00527     int start_label_x_pos = 7; // start label x-pos
00528     int start_label_y_pos = 7; // start label y-pos
00529     int level_cursor_x_pos = 5; // level cursor x-position
00530     int level_cursor_y_pos = 7; // level cursor y-position
00531     int gameover_x_pos = 5; // gameover label x-position
00532     int gameover_y_pos = 5; // gameover label y-position
00533     int win_x_pos = 2; // congratulations label x-position
00534     int win_y_pos = 5; // congratulations label y-position
00535     int startover_x_pos = 3; // startover label x-position
00536     int startover_y_pos = 8; // startover label y-position
00537     int level_cursor_y_pos_end = 11; // BOTTOM CURSOR POS -- Added by Brice for more menu options
00538     int level_cursor_y_pos_start = 7; //--Added by Brice
00539     
00540     // intialize temporary score and current score
00541     int temp = 0;
00542     int score = 0;
00543 
00544         uLCD.cls();
00545     // Begin game loop
00546     while(1)
00547     {
00548         game_menu = true; // defaults to display menu screen
00549         ENEMY_MOVE = true; // defaults to move enemy
00550         DIRECTION = 1; // default to move right
00551         hit_player = 0; // default to not player hit
00552         MOVE_DOWN = 0; // default to not move down
00553         lose = false; // default to not lose
00554          lives1 = 3; // defaults to 3 lives
00555          lives2 = 2;
00556          lives3 = 1;
00557         score = 0; // default to score of 0
00558 
00559         uLCD.cls();
00560         while(!lol.accelAvailable()) {
00561             pos = 0;
00562             }
00563         lol.readAccel();
00564                       
00565         inX = lol.calcAccel(lol.ax);
00566         inY = lol.calcAccel(lol.ay); 
00567         inZ = lol.calcAccel(lol.az);
00568         
00569         // pc.printf("gyro: %d %d %d\n\r", lol.gx, imu.gy, imu.gz);
00570         pc.printf("accel: %d %d %d\n\r", inX, inY, inZ);
00571         //pc.printf("mag: %d %d %d\n\n\r", imu.mx, imu.my, imu.mz);
00572         if (inY >= .5)
00573         {
00574             pc.printf("up\n\r");
00575             pos = 1;
00576           //  wireless.sendDirection(DIR_LEFT);
00577         }
00578         else if( inY <= -.5)
00579         {
00580             pc.printf("down\n\r");
00581             pos = 2;
00582             //wireless.sendDirection(DIR_RIGHT);
00583         }
00584         else if (inX >= .5)
00585         {
00586             pc.printf("right\n\r");
00587             pos = 3;
00588            // wireless.sendDirection(DIR_UP);
00589         }
00590         else if (inX <= -.5)
00591         {
00592             pc.printf("left\n\r");
00593             pos = 4;
00594             //wireless.sendDirection(DIR_DOWN);
00595         }
00596         else
00597         {
00598             pc.printf("error");
00599             pos = 0;
00600            // wireless.sendDirection(DIR_NONE);
00601         }
00602         wait(0.5);
00603         
00604         // Implementation of Game Menu
00605          // Implementation of Game Menu
00606         while(game_menu) 
00607         {
00608              // Brice added this in order to move the cursor through the menu options
00609             uLCD.locate(level_cursor_x_pos, level_cursor_y_pos);
00610             uLCD.printf("  ");
00611             if (pos == 2 && level_cursor_y_pos < level_cursor_y_pos_end) {
00612                 level_cursor_y_pos += 2;
00613             } else if (pos == 1 && level_cursor_y_pos > level_cursor_y_pos_start) {
00614                 level_cursor_y_pos -= 2;
00615             }
00616         
00617             uLCD.locate(level_cursor_x_pos,level_cursor_y_pos); // draws cursor next to "START" label
00618             uLCD.printf("->");
00619             
00620             uLCD.locate(title_x_pos,title_y_pos); // "SPACE INVADERS" title position
00621             uLCD.printf("SPACE INVADERS"); // Title
00622             
00623             uLCD.locate(start_label_x_pos,start_label_y_pos); // "START" label position
00624             uLCD.printf("LEVEL 1");
00625             
00626             uLCD.locate(start_label_x_pos,start_label_y_pos + 2); // "START" label position
00627             uLCD.printf("LEVEL 2");
00628             
00629             uLCD.locate(start_label_x_pos,start_label_y_pos + 4); // "START" label position
00630             uLCD.printf("LEVEL 3");
00631 
00632             // if pushbutton is pressed, game menu is exited and game begins
00633             if(!pb) 
00634             { 
00635                 game_menu = false;
00636                  if (level_cursor_y_pos == start_label_y_pos) {
00637                     level = 1;
00638                 } else if (level_cursor_y_pos == start_label_y_pos + 2) {
00639                     level = 2;
00640                    // pc.printf("num players: 2");
00641                 } else if (level_cursor_y_pos == start_label_y_pos + 4){
00642                     level = 3;
00643                 }
00644            
00645           
00646                 wait(0.5);
00647               
00648             }
00649         }
00650         
00651         
00652         begin_game = true; // defaults begin_game to true
00653         
00654         uLCD.cls();
00655 
00656         // Draw the enemies
00657         draw_enemies_level();
00658 
00659         // Draw the player
00660         draw_initial_player();
00661         
00662         // sets the initial position of player missile and enemy missile (later updated)
00663         blk_x = player.player_blk_x+(player.player_width/2);
00664         blk_y = player.player_blk_y;
00665         missile_init(&missile, blk_x, blk_y, WHITE);
00666         int e_blk_x = 0;
00667         int e_blk_y = 2;
00668         enemy_missile_init(&enemy_missile, e_blk_x, e_blk_y, WHITE);
00669        
00670         // prints lives
00671         if (level == 1){
00672         uLCD.locate(0,0);
00673         uLCD.printf("Lives:%i", 3);
00674         }
00675     
00676         else if (level == 2){
00677         uLCD.locate(0,0);
00678         uLCD.printf("Lives:%i", 2);
00679         }
00680 
00681         else if (level == 3){
00682         uLCD.locate(0,0);
00683         uLCD.printf("Lives:%i", 1);
00684         }
00685         // prints score
00686         uLCD.locate(9,0);
00687         uLCD.printf("Score:%i", score);
00688         
00689         // game play loop
00690         while(begin_game) 
00691         {
00692             // updates score
00693             temp = score;
00694             score = (15-numOfEnemies)*15;
00695             
00696             // prints score if score changes
00697             if (score != temp)
00698             {
00699                 uLCD.locate(9,0);
00700                 uLCD.printf("Score:%i", score);
00701             }
00702             
00703             // move enemy
00704             enemy_motion();
00705 
00706             // checks if player missile passes y-pos of row1
00707             if (missile.missile_blk_y+1-missile.missile_height <= enemy_1.enemy_blk_y
00708                     && missile.missile_blk_y+1-missile.missile_height >= enemy_1.enemy_blk_y-enemy_1.enemy_height) 
00709             {
00710                 check_hit_enemy_row1();
00711             }
00712 
00713             // checks if player missile passes y-pos of row2
00714             if (missile.missile_blk_y+1-missile.missile_height <= enemy_6.enemy_blk_y
00715                     && missile.missile_blk_y+1-missile.missile_height >= enemy_6.enemy_blk_y-enemy_6.enemy_height) 
00716             {
00717                 check_hit_enemy_row2();
00718             }
00719 
00720             // checks if player missile passes y-pos of row3
00721             if (missile.missile_blk_y+1-missile.missile_height <= enemy_11.enemy_blk_y
00722                     && missile.missile_blk_y+1-missile.missile_height >= enemy_11.enemy_blk_y-enemy_11.enemy_height) 
00723             {
00724                 check_hit_enemy_row3();
00725             }
00726             
00727             // Random Enemy Fire
00728             if (enemy_missile.status == ENEMY_MISSILE_INACTIVE) 
00729             {
00730                 random_attack_gen();
00731             }
00732             
00733             // checks if enemy missile passes y-pos of player
00734             if (enemy_missile.missile_blk_y >= player.player_blk_y
00735                     && enemy_missile.missile_blk_y <= player.player_blk_y+player.player_height)
00736             {
00737                 check_player_hit();
00738             }
00739 
00740             update_missile_pos(&missile); // updates player missile position
00741             update_enemy_missile_pos(&enemy_missile); // updates enemy missile position
00742 
00743             // Player Movement checked with navigation switch
00744             if (pos == 4 && ((player.player_blk_x-3) > 0)) 
00745             {
00746                 player_erase(&player);
00747                 player.player_blk_x -= 3;
00748                 player_show(&player);
00749             } 
00750             else if (pos == 3 && ((player.player_blk_x+3) < (128-player.player_width))) 
00751             {
00752                 player_erase(&player);
00753                 player.player_blk_x += 3;
00754                 player_show(&player);
00755             }
00756 
00757             // Player Fire
00758             if (pb == 0 && missile.status == PLAYER_MISSILE_INACTIVE) 
00759             {
00760                 missile.missile_blk_x = player.player_blk_x+(player.player_width/2);
00761                 missile.missile_blk_y = player.player_blk_y;
00762                 missile.status = PLAYER_MISSILE_ACTIVE;
00763             }
00764             
00765             // checks if player destroyed all enemies
00766             if (numOfEnemies == 0)
00767             {
00768                 uLCD.cls();
00769                 
00770                 bool win = true; // sets win to true, for win screen
00771                 begin_game = false;
00772                 
00773                 // displays video clip
00774                 uLCD.cls();
00775                 uLCD.media_init();
00776                 uLCD.set_sector_address(0x00, 0x00);
00777                 uLCD.display_video(0,0);
00778                 wait(1);
00779                 
00780                 uLCD.cls();
00781                 
00782                 // prints "Congratulations" on uLCD    
00783                 uLCD.locate(win_x_pos,win_y_pos);
00784                 uLCD.printf("CONGRATULATIONS!");
00785                 
00786                 // prints "Play Again?" and "Press pb..."
00787                 uLCD.locate(startover_x_pos, startover_y_pos);
00788                 uLCD.printf("Play Again?");
00789                 uLCD.locate(startover_x_pos, startover_y_pos+1);
00790                 uLCD.printf("Press pb...");
00791                 
00792                 // waits at win screen until pushbutton is pressed
00793                 while (win)
00794                 {
00795                     // if pb is pressed, reset game to start menu
00796                     if (!pb)
00797                     {
00798                         win = false;
00799                         wait(0.5);
00800                     }
00801                 }
00802                 
00803             }
00804             
00805             // checks if player was hit
00806             // checks if player was hit
00807             if (hit_player)
00808             {
00809                 if (level == 1){
00810                 //lives = max_lives;
00811                 lives1 -= 1;
00812                 wait(0.5);
00813                 hit_player = 0;
00814                 player_show(&player);
00815                 player.status = PLAYER_ALIVE;
00816                 
00817                 // prints updated lives number
00818                 uLCD.locate(0,0);
00819                 uLCD.printf("Lives:%i", lives1);
00820                 }
00821                 else if (level == 2){
00822                   // lives = max_lives - 1;
00823                 lives2 -= 1;
00824                 wait(0.5);
00825                 hit_player = 0;
00826                 player_show(&player);
00827                 player.status = PLAYER_ALIVE;
00828                 
00829                 // prints updated lives number
00830                 uLCD.locate(0,0);
00831                 uLCD.printf("Lives:%i", lives2);
00832                 } 
00833                     
00834                 else if (level == 3){
00835                 //lives = max_lives - 2;
00836                 lives3 -= 1;
00837                 wait(0.5);
00838                 hit_player = 0;
00839                 player_show(&player);
00840                 player.status = PLAYER_ALIVE;
00841                 
00842                 // prints updated lives number
00843                 uLCD.locate(0,0);
00844                 uLCD.printf("Lives:%i", lives3);
00845                 }
00846                 
00847                 }
00848             // if player loses all lives or enemy reaches the player
00849             if (lose || lives1 == 0 || lives2 == 0 || lives3 == 0)
00850             {    
00851                 begin_game = false; // set to false to end game
00852                 uLCD.cls();
00853                 
00854                 gameover = true; // set to go to display gameover screen
00855                 
00856                 // prints "GAMEOVER" to uLCD
00857                 uLCD.locate(gameover_x_pos, gameover_y_pos);
00858                 uLCD.printf("GAMEOVER");
00859                 wait(1);
00860                 
00861                 // prints "Play Again?" and "Press pb..."
00862                 uLCD.locate(startover_x_pos, startover_y_pos);
00863                 uLCD.printf("Play Again?");
00864                 uLCD.locate(startover_x_pos, startover_y_pos+1);
00865                 uLCD.printf("Press pb...");
00866                 
00867                 // stays in gameover screen until pb is pressed
00868                 while (gameover)
00869                 {
00870                     // if pb is pressed, game is reset to the game menu screen
00871                     if (!pb)
00872                     {
00873                         gameover = false;
00874                         game_menu = true;
00875                         wait(0.5);
00876                     }
00877                 }
00878             }
00879 
00880         }
00881     }
00882 }