![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Updated Space Invaders on the mbed. Improved upon Michael Son's "Mbed Space Invaders" at https://os.mbed.com/users/michaeljson/notebook/mbed-space-invaders/.
Dependencies: mbed wave_player mbed-rtos 4DGL-uLCD-SE SparkfunAnalogJoystick SDFileSystem LSM9DS1_Library_cal_updated
Fork of Two-PlayerSpaceInvaders by
test
Diff: main.cpp
- Revision:
- 31:18a26153eb0e
- Parent:
- 28:a2dac56af32f
- Child:
- 32:a8c6fbc57115
diff -r ff6b8a1ad9f5 -r 18a26153eb0e main.cpp --- a/main.cpp Wed Apr 28 15:55:20 2021 +0000 +++ b/main.cpp Wed Apr 28 18:22:39 2021 +0000 @@ -10,7 +10,7 @@ #include "SparkfunAnalogJoystick.h" #include "LSM9DS1.h" #include <string> - + // Navigation Switch replaced with Analog Joystick and IMU /* ==== Navigation Switch ===== */ /* @@ -70,7 +70,7 @@ return _pins.read(); } */ - + // Platform initialization uLCD_4DGL uLCD(p28,p27,p29); // LCD (serial tx, serial rx, reset pin;) AnalogOut DACout(p18); // speaker @@ -101,13 +101,13 @@ enemy_t enemy_13; enemy_t enemy_14; enemy_t enemy_15; - + // initialize all global barrier objects. barrier_t barrier_1; barrier_t barrier_2; barrier_t barrier_3; barrier_t barrier_4; - + // Initialize variables // Brice added "volatile" here to protect global variables. volatile int numOfEnemies = 0; // number of enemies @@ -135,22 +135,22 @@ Timer bestTimer; // Timer started when the game begins and stopped when the game ends. Used to determine if there's a new best time. Mutex SDLock; // Used to put a mutex lock on the SD card for audio or for reading/writing the best time to the SD card. //Mutex mbedLock; // MIGHT BE NEEDED FOR 2 PLAYER - + // Initialize global player object player_t player; - + // Intialize global player and enemy missile missile_t missile; // player missile missile_t enemy_missile; // enemy missile //missile_t enemy_missile2; // first extra enemy missile for level 2 (medium difficulty) - + // Array of enemy objects enemy_t * enemyArray[15]; - + // Function Prototypes void move_enemy_down(); void playstart(void const *args); // PUT BACK IN - + // Draws the enemies at the initial starting location void draw_enemies_level() { @@ -160,51 +160,54 @@ numOfEnemies = 15; // First Row of Enemies - enemy_init(&enemy_1,start_x_pos,start_enemy_y_pos,WHITE); // initialize x-pos and y-pos and color of enemy + // First Row of Enemies + enemy_init(&enemy_1,start_x_pos,start_enemy_y_pos,RED); // initialize x-pos and y-pos and color of enemy_show(&enemy_1); // displays the enemy on uLCD - enemy_init(&enemy_2,start_x_pos+15,start_enemy_y_pos,WHITE); + enemy_init(&enemy_2,start_x_pos+15,start_enemy_y_pos,RED); enemy_show(&enemy_2); - enemy_init(&enemy_3,start_x_pos+30,start_enemy_y_pos,WHITE); + enemy_init(&enemy_3,start_x_pos+30,start_enemy_y_pos,RED); enemy_show(&enemy_3); - enemy_init(&enemy_4,start_x_pos+45,start_enemy_y_pos,WHITE); + enemy_init(&enemy_4,start_x_pos+45,start_enemy_y_pos,RED); enemy_show(&enemy_4); - enemy_init(&enemy_5,start_x_pos+60,start_enemy_y_pos,WHITE); + enemy_init(&enemy_5,start_x_pos+60,start_enemy_y_pos,RED); enemy_show(&enemy_5); // Second Row of Enemies - enemy_init(&enemy_6,start_x_pos,start_enemy_y_pos+12,WHITE); + enemy_init(&enemy_6,start_x_pos,start_enemy_y_pos+12,RED); enemy_show(&enemy_6); - enemy_init(&enemy_7,start_x_pos+15,start_enemy_y_pos+12,WHITE); + enemy_init(&enemy_7,start_x_pos+15,start_enemy_y_pos+12,RED); enemy_show(&enemy_7); - enemy_init(&enemy_8,start_x_pos+30,start_enemy_y_pos+12,WHITE); + enemy_init(&enemy_8,start_x_pos+30,start_enemy_y_pos+12,RED); enemy_show(&enemy_8); - enemy_init(&enemy_9,start_x_pos+45,start_enemy_y_pos+12,WHITE); + enemy_init(&enemy_9,start_x_pos+45,start_enemy_y_pos+12,RED); enemy_show(&enemy_9); - enemy_init(&enemy_10,start_x_pos+60,start_enemy_y_pos+12,WHITE); + enemy_init(&enemy_10,start_x_pos+60,start_enemy_y_pos+12,RED); enemy_show(&enemy_10); // Third Row of Enemies - enemy_init(&enemy_11,start_x_pos,start_enemy_y_pos+24,WHITE); + enemy_init(&enemy_11,start_x_pos,start_enemy_y_pos+24,RED); enemy_show(&enemy_11); - enemy_init(&enemy_12,start_x_pos+15,start_enemy_y_pos+24,WHITE); + enemy_init(&enemy_12,start_x_pos+15,start_enemy_y_pos+24,RED); enemy_show(&enemy_12); - enemy_init(&enemy_13,start_x_pos+30,start_enemy_y_pos+24,WHITE); + enemy_init(&enemy_13,start_x_pos+30,start_enemy_y_pos+24,RED); enemy_show(&enemy_13); - enemy_init(&enemy_14,start_x_pos+45,start_enemy_y_pos+24,WHITE); + enemy_init(&enemy_14,start_x_pos+45,start_enemy_y_pos+24,RED); enemy_show(&enemy_14); - enemy_init(&enemy_15,start_x_pos+60,start_enemy_y_pos+24,WHITE); + enemy_init(&enemy_15,start_x_pos+60,start_enemy_y_pos+24,RED); + enemy_show(&enemy_15); + enemy_init(&enemy_15,start_x_pos+60,start_enemy_y_pos+24,RED); enemy_show(&enemy_15); // Put enemy objects into array @@ -224,7 +227,7 @@ enemyArray[13] = &enemy_14; enemyArray[14] = &enemy_15; } - + // Draw and initialize the 4 barriers that the player can hide behind. void draw_barriers_level() { // Initialize local variables @@ -240,7 +243,7 @@ barrier_init(&barrier_4,start_x_pos+96,start_barrier_y_pos,GREEN); barrier_show(&barrier_4); } - + // Draws the player at the initial starting location void draw_initial_player() { @@ -250,7 +253,7 @@ player_init(&player,start_x_pos,start_y_pos,WHITE); // intialize x-pos and y-pos and color of player player_show(&player); // display player on uLCD } - + // Checks all enemies in row 1 void check_hit_enemy_row1() { @@ -268,7 +271,7 @@ hit_enemy = check_enemy(&enemy_5, &missile); numOfEnemies = numOfEnemies - hit_enemy; } - + // Same as check_hit_enemy_row1, but checks enemies at row 2 void check_hit_enemy_row2() { @@ -286,12 +289,12 @@ hit_enemy = check_enemy(&enemy_10, &missile); numOfEnemies = numOfEnemies - hit_enemy; } - + // Same as check_hit_enemy_row1, but checks enemies at row 3 void check_hit_enemy_row3() { int hit_enemy; - + // Third Row of Enemies hit_enemy = check_enemy(&enemy_11, &missile); numOfEnemies = numOfEnemies - hit_enemy; @@ -304,13 +307,13 @@ hit_enemy = check_enemy(&enemy_15, &missile); numOfEnemies = numOfEnemies - hit_enemy; } - + // Checks if player is hit void check_player_hit() { hit_player = check_player(&player, &enemy_missile); // checks if the missile hits the player and returns 1 if hit, 0 if not hit } - + // Randomly selects an enemy to fire and updates the position of where the missile will fire from void random_attack_gen() { @@ -341,7 +344,7 @@ enemy_missile.status = ENEMY_MISSILE_ACTIVE; } } - + // moves the enemy void enemy_motion() { @@ -398,7 +401,7 @@ ENEMY_MOVE += 1; } } - + // moves all the enemies down in the y-direction void move_enemy_down() { @@ -441,7 +444,7 @@ enemy_14.enemy_blk_y += enemy_14.enemy_height+4; enemy_15.enemy_blk_y += enemy_15.enemy_height+4; } - + // thread that plays sounds during game void playstart(void const *args)//Th { //Depending on the state of the game, @@ -509,8 +512,8 @@ } } } - - + + // thread that adds RGB LED Lighting Effects that coincide with the game -- Brice void ledEffects(void const *args)//Th { //Depending on the state of the game, @@ -628,10 +631,10 @@ } } } - + // SLAVE AND MASTER THREADS BELOW ARE USED ONLY WITH 2 PLAYER (STILL BUGGY AND REQUIRES EXTRA HARDWARE) // UNCOMMENT THIS THREAD IF SECOND PLAYER AND COMMENT MASTER THREAD - + // The slave mbed device (second player) should uncomment this thread -- Brice /* void mbedSlave(void const *args) { @@ -651,7 +654,7 @@ } } */ - + //first_player_ready = true; //second_player_ready = true; // begin_game2 = true; @@ -680,9 +683,9 @@ // Thread::wait(1000); // } //} - - - + + + // UNCOMMENT THIS THREAD IF FIRST PLAYER AND COMMENT SLAVE THREAD // The master mbed device (second player) should uncomment this thread -- Brice /* @@ -735,7 +738,7 @@ } } */ - + int main() { IMU.begin(); // start the IMU if (!IMU.begin()) { // print error message if error with IMU @@ -900,10 +903,10 @@ //} // clear the screen to start drawing the level uLCD.cls(); - + // Draw the enemies draw_enemies_level(); - + // Draw the player draw_initial_player(); @@ -939,7 +942,7 @@ } //uLCD.locate(0,0); //uLCD.printf("Lives:%i", lives); // original, basic lives - + // prints score (no competition possible since the score always ends as the same) uLCD.locate(9,0); uLCD.printf("Score:%i", score); @@ -984,14 +987,14 @@ { check_hit_enemy_row1(); } - + // checks if player missile passes y-pos of row2 if (missile.missile_blk_y+1-missile.missile_height <= enemy_6.enemy_blk_y && missile.missile_blk_y+1-missile.missile_height >= enemy_6.enemy_blk_y-enemy_6.enemy_height) { check_hit_enemy_row2(); } - + // checks if player missile passes y-pos of row3 if (missile.missile_blk_y+1-missile.missile_height <= enemy_11.enemy_blk_y && missile.missile_blk_y+1-missile.missile_height >= enemy_11.enemy_blk_y-enemy_11.enemy_height) @@ -1035,10 +1038,10 @@ check_player_hit(); } - + update_missile_pos(&missile); // updates player missile position update_enemy_missile_pos(&enemy_missile, level); // updates enemy missile position - + // Player Movement checked with navigation switch //if (myNav.left() && ((player.player_blk_x-3) > 0)) @@ -1272,7 +1275,7 @@ } } } - + } // game play loop /* TWO-PLAYER MODE: BUGGY, BUT THE PRIMITIVES ARE IN PLACE. @@ -1311,14 +1314,14 @@ { check_hit_enemy_row1(); } - + // checks if player missile passes y-pos of row2 if (missile.missile_blk_y+1-missile.missile_height <= enemy_6.enemy_blk_y && missile.missile_blk_y+1-missile.missile_height >= enemy_6.enemy_blk_y-enemy_6.enemy_height) { check_hit_enemy_row2(); } - + // checks if player missile passes y-pos of row3 if (missile.missile_blk_y+1-missile.missile_height <= enemy_11.enemy_blk_y && missile.missile_blk_y+1-missile.missile_height >= enemy_11.enemy_blk_y-enemy_11.enemy_height) @@ -1349,10 +1352,10 @@ check_player_hit(); } - + update_missile_pos(&missile); // updates player missile position update_enemy_missile_pos(&enemy_missile, level); // updates enemy missile position - + // Player Movement checked with navigation switch //if (myNav.left() && ((player.player_blk_x-3) > 0)) // With joystick click, change color of player from GREEN -> BLUE -> PINK -> PURPLE -> YELLOW (and loop). @@ -1646,4 +1649,4 @@ } }*/ } -} +} \ No newline at end of file