Mortal Kombat Game ELEC2645
Dependencies: mbed N5110 ShiftReg Joystick
Diff: main.cpp
- 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; +}