Mortal Kombat Game ELEC2645

Dependencies:   mbed N5110 ShiftReg Joystick

Revision:
0:99b49fd71085
Child:
1:3bdadf6f6dbd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Apr 13 10:06:02 2021 +0000
@@ -0,0 +1,205 @@
+///////////// includes /////////////////////
+#include "mbed.h"
+#include "N5110.h"
+#include "Fighter.h"
+#include "Joystick.h"
+#include "Menu.h"
+///////////// defines /////////////////////
+#define SPEED         -69
+#define GROUND         34
+///////////// objects ///////////////////
+Fighter fighter; 
+Menu menu;
+DigitalIn buttonA(p29);
+DigitalIn buttonB(p28);
+DigitalIn buttonC(p27);
+DigitalIn 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 menu_select();
+char get_user_input();
+
+
+int main() {
+    init();
+    // menu_screen();
+    while(1) {
+        lcd.clear();
+        draw_background();
+        move_sprite();
+    }
+}
+
+void init() { // initialize all devices
+    lcd.init();
+    lcd.setContrast(0.5);
+    // since Button A has an external pull-down, we should disable to internal pull-down
+    // resistor that is enabled by default
+    // buttonA.mode(PullNone);
+    // buttonB.mode(PullNone);
+    // buttonC.mode(PullNone);
+    // buttonD.mode(PullNone);
+}
+
+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.A_to_start(lcd); // 3rd menu screen asking user to press A to start game
+    wait(3.5f);
+    
+    while (1) {
+        if (buttonA.read() == 1) {
+            menu.homescreen(lcd);
+            menu_select();
+        }
+    }
+}
+
+
+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.45 && x < 0.55) { // 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.45) { //  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.55) { // joystick moved to the left
+        // printing only the first move left animation for comparison
+        fighter.move_left(lcd, SPEED*x+71, GROUND);
+        //wait(0.01);
+        //fighter.move_left2(lcd, -25*x+30, 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 menu_select() {
+    char button = get_user_input();
+    switch (button) {
+    case 'A':
+      menu.play(lcd);
+      break;
+    case 'B':
+      menu.tutorial(lcd);
+      break;
+    case 'C':
+      menu.options_menu(lcd);
+      break;
+    default:
+      menu.homescreen(lcd); 
+      break;
+  }
+}
+
+char get_user_input() {
+    char button;
+    while (buttonA.read() == 1) {button = 'A';}
+    while (buttonB.read() == 1) {button = 'B';}
+    while (buttonC.read() == 1) {button = 'C';}
+    while (buttonD.read() == 1) {button = 'D';}
+    pc.printf("Value is %c", button);
+    return button;
+}