The classic dueling tanks game for mbed.
Dependencies: 4DGL-uLCD-SE DRV2605 EthernetInterface Game_Synchronizer MMA8452 SDFileSystem SparkfunAnalogJoystick mbed-rtos mbed wave_player
Fork of 2035_Tanks_Shell by
Diff: main.cpp
- Revision:
- 22:3c68eea5a609
- Parent:
- 21:edfeb289b21f
- Child:
- 23:77049670cae6
diff -r edfeb289b21f -r 3c68eea5a609 main.cpp --- a/main.cpp Thu Oct 29 03:56:30 2015 +0000 +++ b/main.cpp Thu Oct 29 05:14:49 2015 +0000 @@ -30,8 +30,7 @@ Timer frame_timer; // Timer // Global variables go here. -int winner = -1; -int whose_turn = PLAYER1; + @@ -40,24 +39,21 @@ // writing to the local (Player1) lcd. Sync hasn't been initialized yet, // so you can't use it anyway. For the same reason, you must access // the buttons directly e.g. if( !pb_r ) { do something; }. + +// return MULTI_PLAYER if the user selects multi-player. +// return SINGLE_PLAYER if the user selects single-player. int game_menu(void) { uLCD.baudrate(BAUD_3000000); - uLCD.locate(0,1); - uLCD.puts("Select Mode:"); - uLCD.locate(0,3); - uLCD.puts(" Single-Player:"); - uLCD.locate(0,4); - uLCD.puts(" Left Button"); - uLCD.locate(0,6); - uLCD.puts(" Multi-Player:"); - uLCD.locate(0,7); - uLCD.puts(" Right Button"); + + // the locate command tells the screen where to place the text. + uLCD.locate(0,15); + uLCD.puts("Replace me"); - while(1) { - if(!pb_r) { return MULTI_PLAYER; } // Right button -> Multiplayer - if(!pb_l) { return SINGLE_PLAYER; } // Left button -> Single player - } + // Button Example: + // Use !pb_r to access the player1 right button value. + wait(2); + return SINGLE_PLAYER; } // Initialize the world map. I've provided a basic map here, @@ -78,8 +74,8 @@ // Draw the ground in green. sync.filled_rectangle(0,0,128,20, GND_COLOR); - // Draw a wall in the middle of the map. It doesn't have to be black, - // but it shouldn't be the same color as the sky or your tanks. + // Draw some obstacles. They don't have to be black, + // but they shouldn't be the same color as the sky or your tanks. // Get creative here. You could use brown and grey to draw a mountain // or something cool like that. sync.filled_rectangle(59, 20, 69, 60, BLACK); @@ -89,8 +85,9 @@ // Set the text background color to match the sky. Just for looks. sync.textbackground_color(SKY_COLOR); + // Display the game title. - char title[] = " ECE 2035 Tanks"; + char title[] = " Title"; sync.puts(title, sizeof(title)); sync.update(); } @@ -116,48 +113,13 @@ pc.printf("Initialized...\n"); // Let us know you finished initializing. } -// Given the filename of a .wav file in the SD card, play the file over the speaker. -void playSound(char * wav) -{ - // open wav file - FILE *wave_file; - wave_file=fopen(wav,"r"); - - if(wave_file == NULL){ - uLCD.locate(0,4); - uLCD.printf("Error in SD"); - return; - } - // play wav file - player.play(wave_file); - - // close wav file - fclose(wave_file); +// Display some kind of game over screen which lets us know who won. +// Play a cool sound! +void game_over() { + } -// Display some kind of game over screen which lets us know who won. -void game_over(int winner) { - if(winner == PLAYER1) { pc.printf("Player 1 wins!\n"); } - else if(winner == PLAYER2) { pc.printf("Player 2 wins!\n"); } - - int i = 0; - while(1) { - sync.cls(); - sync.locate(i, 9); - if(winner == PLAYER1) { - char msg[] = "P1 Wins!"; - sync.puts(msg, sizeof(msg)); - } else if(winner == PLAYER2) { - char msg[] = "P2 Wins!"; - sync.puts(msg, sizeof(msg)); - } - - sync.update(); - i = (i+1)%11; - wait(0.1); - } -} int main (void) { int* p1_buttons; @@ -168,102 +130,52 @@ game_init(); + // Create your tanks. Tank t1(4, 21, 12, 8, TANK_RED); // (min_x, min_y, width, height, color) Tank t2(111, 21, 12, 8, TANK_BLUE); // (min_x, min_y, width, height, color) + + // For each tank, create a bullet. Bullet b1(&t1); Bullet b2(&t2); - frame_timer.start(); while(true) { + // Read the buttons/accelerometer and store the values + // in the synchronizer's internal array. sync.set_p1_inputs(); + // Get a pointer to the buttons for both sides. p1_buttons = sync.get_p1_buttons(); p2_buttons = sync.get_p2_buttons(); - sync.get_p1_accel_data(ax1, ay1, az1); - sync.get_p2_accel_data(ax2, ay2, az2); + // Get the accelerometer values. + sync.get_p1_accel_data(&ax1, &ay1, &az1); + sync.get_p2_accel_data(&ax2, &ay2, &az2); + + // Game logic goes here. - led1 = p2_buttons[0] ^ p2_buttons[0]; - led2 = p2_buttons[1] ^ p2_buttons[1]; - led3 = p2_buttons[2] ^ p2_buttons[2]; - led4 = p2_buttons[3] ^ p2_buttons[3]; - + // Depending on whose turn it is, + // - update their tank's position using the accelerometer state for that player. + // - update their bullet's position using the time elapsed since the previous frame. + + // You have to handle the case where sync.play_mode == SINGLE_PLAYER + // as well as the case where sync.play_mode == MULTI_PLAYER - if(whose_turn == PLAYER1) { - if(ax1 > ACC_THRESHOLD) { t1.reposition(-1, 0, 0); } - if(ax1 < -ACC_THRESHOLD) { t1.reposition(+1, 0, 0); } - - if(ay1 > ACC_THRESHOLD) { t1.reposition(0, 0, +PI/30.0); } - if(ay1 < -ACC_THRESHOLD) { t1.reposition(0, 0, -PI/30.0); } - - if(p1_buttons[D_BUTTON]) { - b1.shoot(); - } - - float dt = frame_timer.read(); - int intersection_code = b1.time_step(dt); - - if(intersection_code != BULLET_NO_COLLISION || intersection_code == BULLET_OFF_SCREEN) { pc.printf("Now it's P2's turn!\n"); whose_turn = PLAYER2; } - - // If you have shot yourself, you lost. - if(intersection_code == CONVERT_24_TO_16_BPP(t1.tank_color)) { - sync.update(); // Is this necessary? - winner = PLAYER2; - break; - } - - // If you have shot the other guy, you won! - if(intersection_code == CONVERT_24_TO_16_BPP(t2.tank_color)) { - sync.update(); - winner = PLAYER1; - break; - } - } else if(whose_turn == PLAYER2) { - - if((sync.play_mode == MULTI_PLAYER && ax2 > ACC_THRESHOLD) || (sync.play_mode == SINGLE_PLAYER && ax1 > ACC_THRESHOLD)) { - t2.reposition(-1, 0, 0); - } - if((sync.play_mode == MULTI_PLAYER && ax2 < -ACC_THRESHOLD) || (sync.play_mode == SINGLE_PLAYER && ax1 < -ACC_THRESHOLD)) { - t2.reposition(+1, 0, 0); - } - if((sync.play_mode == MULTI_PLAYER && ay2 > ACC_THRESHOLD) || (sync.play_mode == SINGLE_PLAYER && ay1 > ACC_THRESHOLD)) { - t2.reposition(0, 0, -PI/30.0); - } - if((sync.play_mode == MULTI_PLAYER && ay2 < -ACC_THRESHOLD) || (sync.play_mode == SINGLE_PLAYER && ay1 < -ACC_THRESHOLD)) { - t2.reposition(0, 0, +PI/30.0); - } - if((sync.play_mode == MULTI_PLAYER && p2_buttons[D_BUTTON]) || (sync.play_mode == SINGLE_PLAYER && p1_buttons[D_BUTTON])) { - b2.shoot(); - } - - float dt = frame_timer.read(); - int intersection_code = b2.time_step(dt); - - if(intersection_code != BULLET_NO_COLLISION || intersection_code == BULLET_OFF_SCREEN) { pc.printf("Now it's P1's turn!\n"); whose_turn = PLAYER1; } - - // If you shot yourself, you lost. - if(intersection_code == CONVERT_24_TO_16_BPP(t2.tank_color)) { - sync.update(); // Is this necessary? - winner = PLAYER1; - break; - } - - // If you shot the other guy, you won! - if(intersection_code == CONVERT_24_TO_16_BPP(t1.tank_color)) { - sync.update(); - winner = PLAYER2; - break; - } - } - - frame_timer.reset(); - sync.update(); + // Useful functions: + // t1.reposition(...); + // t2.reposition(...); + // b1.timestep(...); + // b2.timestep(...); + + // End of game logic + + // sync.update() flushes the internal buffer and performs all the draw commands on both sides. + // This must be called at the end of every frame, or things won't be drawn and buttons won't get + // updated. + sync.update(); } - playSound("/sd/wavfiles/BUZZER.wav"); - - game_over(winner); + game_over(); } \ No newline at end of file