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: mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem
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 }
Generated on Fri Jul 15 2022 11:23:44 by
1.7.2