Mortal Kombat Game ELEC2645
Dependencies: mbed N5110 ShiftReg Joystick
main.cpp
- Committer:
- ozy
- Date:
- 2021-04-17
- Revision:
- 2:1703eb2a68f8
- Parent:
- 1:3bdadf6f6dbd
- Child:
- 3:1d99b6ad4f9e
File content as of revision 2:1703eb2a68f8:
///////////// includes ///////////////////// #include "mbed.h" #include "N5110.h" #include "Fighter.h" #include "Joystick.h" #include "Menu.h" #include "Enemy.h" ///////////// defines ///////////////////// #define SPEED -69 #define GROUND 34 ///////////// objects /////////////////// Fighter fighter; Menu menu; Enemy enemy; InterruptIn buttonA(p29); InterruptIn buttonB(p28); InterruptIn buttonC(p27); InterruptIn buttonD(p26); AnalogIn joy_v(p20); AnalogIn joy_h(p19); N5110 lcd(p14,p8,p9,p10,p11,p13,p21); BusOut leds(LED4,LED3,LED2,LED1); Serial pc(USBTX, USBRX); //////////// functions //////////////////// void init(); void menu_screen(); void move_sprite(); void draw_background(); void move_enemy(); int get_user_input(int &input); void buttonA_isr(); void buttonB_isr(); void buttonC_isr(); void buttonD_isr(); void button_init(); void check_interrupt(); //////////// initializations //////////////////// volatile int g_buttonA_flag = 0; volatile int g_buttonB_flag = 0; volatile int g_buttonC_flag = 0; volatile int g_buttonD_flag = 0; int main() { init(); menu_screen(); while(1) { lcd.clear(); // draw_background(); // move_enemy(); // move_sprite(); check_interrupt(); // put the MCU to sleep until an interrupt wakes it up sleep(); } } void init() { // initialize all devices lcd.init(); lcd.setContrast(0.5); button_init(); } void menu_screen() { menu.main_menu(lcd); // printing the menu screen wait(3.5f); menu.created_by(lcd); // 2nd menu screen wait(3.5f); menu.homescreen(lcd); // print homescreen menu.menu_selection(lcd, buttonA, buttonB, buttonC, buttonD); // function to ask user to select menu item } void draw_background() { // lcd.drawLine(x1, y1, x2, y2, type); lcd.drawLine(0,46,82,46,1); // draws ground platform lcd.drawLine(0,46,0,25,1); // draws first side wall lcd.drawLine(82,46,82,25,1); // draws second side wall lcd.refresh(); } void move_sprite() { // getting joystick coordinates using read() function // joystick centered at (0.50,0.50) with utmost left at (1.00,0.50) and utmost right being (0.00,0.50) // read each of the pins float x = joy_h.read(); float y = joy_v.read(); printf("x = %.2f | y = %.2f \n",x,y); /* Code idea: if joystick is not moved , display standing sprite if joystick is moved right, toggle between runright and midrunright if joystick is moved left, toggle between runleft and midrunleft */ if(x > 0.48 && x < 0.52) { // joystick not moved - we use ± 0.05 to take account of fluctuation in joystick tolerance and noice on ADC fighter.draw(lcd, x+33, GROUND); // draw standing fighter and add 30 print it on middle of lcd screen // ... and the y-coordinate to place sprite exactly on ground is 34 ( 46 - 12(height of sprite) = 34 ) lcd.refresh(); wait(0.2); // Preform kick move if user presses button A while (buttonA.read() == 1) { fighter.kick_right(lcd, x+33, GROUND); // draw kick on same coordinates as the standing sprite lcd.refresh(); wait(0.2); } // Preform punch move if user presses button B while (buttonB.read() == 1) { fighter.punch_right(lcd, x+33, GROUND); // draw kick on same coordinates as the standing sprite lcd.refresh(); wait(0.2); } // Guard if user presses button C while (buttonC.read() == 1) { fighter.guard(lcd, x+33, GROUND); // draw guard move on same coordinates as the standing sprite lcd.refresh(); wait(0.2); } // Jump if user presses button D while (buttonD.read() == 1) { fighter.draw(lcd, x+33, GROUND-15); // adding 15 the sprite y-coordinate to create jump move lcd.refresh(); wait(0.2); } } else if(x < 0.48) { // joystick moved to the right // print the move_right animation, refresh, then print the 2nd move_right animation (toggling animations to create moving legs!) fighter.move_right(lcd, SPEED*x+70, GROUND); // draw standing fighter, multiply by speed -69 (negative to correct for direction!) lcd.refresh(); wait(0.1); fighter.move_right2(lcd, SPEED*x+70, GROUND); lcd.refresh(); wait(0.08); // kick if user presses button A while (buttonA.read() == 1) { fighter.kick_right(lcd, SPEED*x+70, GROUND); lcd.refresh(); wait(0.2); } // Preform punch move if user presses button B while (buttonB.read() == 1) { fighter.punch_right(lcd, SPEED*x+70, GROUND); // draw kick on same coordinates as the sprite lcd.refresh(); wait(0.2); } // Guard if user presses button C while (buttonC.read() == 1) { fighter.guard(lcd, SPEED*x+70, GROUND); // draw kick on same coordinates as the sprite lcd.refresh(); wait(0.2); } } else if(x > 0.52) { // joystick moved to the left fighter.move_left(lcd, SPEED*x+71, GROUND); lcd.refresh(); wait(0.1); fighter.move_left2(lcd, SPEED*x+71, 34); lcd.refresh(); wait(0.08); } // kick if user presses button A while (buttonA.read() == 1) { fighter.kick_left(lcd, SPEED*x+71, GROUND); lcd.refresh(); wait(0.2); } while (buttonB.read() == 1) { fighter.punch_left(lcd, SPEED*x+71, GROUND); // draw kick on same coordinates as the sprite lcd.refresh(); wait(0.2); } // Guard if user presses button C while (buttonC.read() == 1) { fighter.guard(lcd, SPEED*x+71, GROUND); // draw kick on same coordinates as the sprite lcd.refresh(); wait(0.2); } } void move_enemy() { // read each of the pins float x = joy_h.read(); float y = joy_v.read(); printf("x = %.2f | y = %.2f \n",x,y); if(x > 0.48 && x < 0.52) { // joystick not moved - we use ± 0.05 to take account of fluctuation in joystick tolerance and noice on ADC enemy.draw(lcd, x+33, GROUND); // draw standing fighter and add 30 print it on middle of lcd screen // ... and the y-coordinate to place sprite exactly on ground is 34 ( 46 - 12(height of sprite) = 34 ) lcd.refresh(); wait(0.2); // Preform kick move if user presses button A while (buttonA.read() == 1) { enemy.kick_right(lcd, x+33, GROUND); // draw kick on same coordinates as the standing sprite lcd.refresh(); wait(0.2); } // Preform punch move if user presses button B while (buttonB.read() == 1) { enemy.sword_right(lcd, x+33, GROUND); // draw kick on same coordinates as the standing sprite lcd.refresh(); wait(0.2); } } else if(x < 0.48) { // joystick moved to the right // print the move_right animation, refresh, then print the 2nd move_right animation (toggling animations to create moving legs!) enemy.move_right(lcd, SPEED*x+70, GROUND); // draw standing fighter, multiply by speed -69 (negative to correct for direction!) lcd.refresh(); wait(0.1); enemy.move_right2(lcd, SPEED*x+70, GROUND); lcd.refresh(); wait(0.08); // kick if user presses button A while (buttonA.read() == 1) { enemy.kick_right(lcd, SPEED*x+70, GROUND); lcd.refresh(); wait(0.2); } // Preform punch move if user presses button B while (buttonB.read() == 1) { enemy.sword_right(lcd, SPEED*x+70, GROUND); // draw kick on same coordinates as the sprite lcd.refresh(); wait(0.2); } } else if(x > 0.52) { // joystick moved to the left enemy.move_left(lcd, SPEED*x+71, GROUND); lcd.refresh(); wait(0.1); enemy.move_left2(lcd, SPEED*x+71, 34); lcd.refresh(); wait(0.08); } // kick if user presses button A while (buttonA.read() == 1) { enemy.kick_left(lcd, SPEED*x+71, GROUND); lcd.refresh(); wait(0.2); } while (buttonB.read() == 1) { enemy.sword_left(lcd, SPEED*x+71, GROUND); // draw kick on same coordinates as the sprite lcd.refresh(); wait(0.2); } } int get_user_input(int &input) { while (1) { if (buttonA.read() == 1) { input = 1; break; } if (buttonB.read() == 1) { input = 2; break; } if (buttonC.read() == 1) { input = 3; break; } if (buttonD.read() == 1) { input = 4; break; } } return input; } // Button A B C D event-triggered interrupt void buttonA_isr() { g_buttonA_flag = 1; // set flag in ISR } void buttonB_isr() { g_buttonB_flag = 1; // set flag in ISR } void buttonC_isr() { g_buttonC_flag = 1; // set flag in ISR } void buttonD_isr() { g_buttonD_flag = 1; // set flag in ISR } void button_init() { buttonA.rise(&buttonA_isr); buttonB.rise(&buttonB_isr); buttonC.rise(&buttonC_isr); buttonD.rise(&buttonD_isr); buttonA.mode(PullNone); buttonB.mode(PullNone); buttonC.mode(PullNone); buttonD.mode(PullNone); } void check_interrupt() { int input; get_user_input(input); // check if flag i.e. interrupt has occured if (g_buttonA_flag == 1) { g_buttonA_flag = 0; printf("user input is %i ", input); wait(0.1); } else if (g_buttonB_flag == 1) { g_buttonB_flag = 0; printf("user input is %i ", input); wait(0.1); } else if (g_buttonC_flag == 1) { g_buttonC_flag = 0; printf("user input is %i ", input); wait(0.1); } else if (g_buttonD_flag == 1) { g_buttonD_flag = 0; printf("user input is %i ", input); wait(0.1); } }