Mortal Kombat Game ELEC2645

Dependencies:   mbed N5110 ShiftReg Joystick

main.cpp

Committer:
ozy
Date:
2021-04-20
Revision:
5:889ad974b64d
Parent:
4:6b1de03716d6
Child:
6:a1a7dc264fed

File content as of revision 5:889ad974b64d:

///////////// includes /////////////////////
#include "mbed.h"
#include "N5110.h"
#include "Fighter.h"
#include "Joystick.h"
#include "Menu.h"
#include "Enemy.h"
///////////// defines /////////////////////
#define GROUND         34
///////////// objects ///////////////////
Fighter fighter;
Menu menu;
Enemy enemy;
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 move_enemy();



int main() {
    init();
    // menu_screen();
    while(1) {
        lcd.clear();
        draw_background();
        move_sprite();
        // move_enemy();
    }
}

void init() { // initialize all devices
    lcd.init();
    lcd.setContrast(0.5);
    fighter.set_x(33);  // setting initial position of fighter
    fighter.set_y(GROUND);  // placing fighter on ground
    enemy.set_x(33);  // setting initial position of fighter
    enemy.set_y(GROUND);  // placing fighter on ground
}

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);
    // get x position of fighter
    int x_pos = fighter.get_x();
    printf("fighter x pos = %i \n", x_pos);
    
/*
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.02 to take account of fluctuation in joystick tolerance and noice on ADC
          fighter.draw(lcd); // draw standing fighter 
          lcd.refresh();
          wait(0.3);

           // Preform kick move if user presses button A
        if (buttonA.read() == 1) {
            fighter.kick_right(lcd);  // draw kick on same coordinates as the standing sprite
            lcd.refresh();
            wait(0.3);
        }
        // Preform punch move if user presses button B
        if (buttonB.read() == 1) {
            fighter.punch_right(lcd);  // draw kick 
            lcd.refresh();
            wait(0.3);
        }
        // Guard if user presses button C
        while (buttonC.read() == 1) {
            fighter.guard(lcd);  // draw guard move frame
            lcd.refresh();
            wait(0.3);
        }
    }
    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.add_x(5);           // increment by 5
        fighter.move_right(lcd);
        lcd.refresh();
        wait(0.1);
        fighter.move_right2(lcd);
        lcd.refresh();
        wait(0.08);
        
        if (x_pos >= 65) {   // code to stop fighter moving out of lcd screen
            fighter.add_x(-5);
        }
    
        
        // kick if user presses button A
        if (buttonA.read() == 1) {
                fighter.kick_right(lcd);
                lcd.refresh();
                wait(0.3);
            }
        // Preform punch move if user presses button B
        if (buttonB.read() == 1) {
            fighter.punch_right(lcd);  // draw kick on same coordinates as the sprite
            lcd.refresh();
            wait(0.3);
        }
        // Guard if user presses button C
        while (buttonC.read() == 1) {       // we use while not if here because user would hold to guard 
            fighter.guard(lcd);  // draw kick on same coordinates as the sprite
            lcd.refresh();
            wait(0.3);
        }
    }
    
    else if(x > 0.52) { // joystick moved to the left
        fighter.add_x(-5);      // decrement left by 5
        fighter.move_left(lcd);
        lcd.refresh();
        wait(0.1);
        fighter.move_left2(lcd);
        lcd.refresh();
        wait(0.08);
        
        if (x_pos <= 6) {   // code to stop fighter moving out of lcd screen
            fighter.add_x(5);
        }

    // kick if user presses button A
        if (buttonA.read() == 1) {
            fighter.kick_left(lcd);
            lcd.refresh();
            wait(0.3);
        }
        if (buttonB.read() == 1) {
            fighter.punch_left(lcd);  // draw punch on same coordinates as the sprite
            lcd.refresh();
            wait(0.3);
        }
        // Guard if user presses button C
        if (buttonC.read() == 1) {
            fighter.guard(lcd);  // draw guard on same coordinates as the sprite
            lcd.refresh();
            wait(0.3);
        }
    }
}

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);
    // get x position of enemy
    int x_pos = enemy.get_x();
    printf("enemy x pos = %i \n", x_pos);

    if(x > 0.48 && x < 0.52) { // joystick not moved - we use ± 0.02 to take account of fluctuation in joystick tolerance and noice on ADC
          enemy.draw(lcd); // draw enemy
          lcd.refresh();
          wait(0.3);
       // Preform kick move if user presses button A
        if (buttonA.read() == 1) {
            enemy.kick_right(lcd);  // draw kick on same coordinates as the standing sprite
            lcd.refresh();
            wait(0.3);
        }
        // Preform punch move if user presses button B
        if (buttonB.read() == 1) {
            enemy.sword_right(lcd);  // draw sword move on same coordinates as the standing sprite
            lcd.refresh();
            wait(0.3);
        }
    }
    else if(x < 0.48) { //  joystick moved to the right
        enemy.add_x(5);           // increment by 5
        // print  the  move_right animation, refresh, then print the 2nd move_right animation (toggling animations to create moving legs!)
        enemy.move_right(lcd); // draw standing fighter, multiply by speed -69 (negative to correct for direction!)
        lcd.refresh();
        wait(0.1);
        enemy.move_right2(lcd);
        lcd.refresh();
        wait(0.08);
        
        if (x_pos >= 65) {   // code to stop enemy moving out of lcd screen
            enemy.add_x(-5);
        }
        
        // kick if user presses button A
        if (buttonA.read() == 1) {
            enemy.kick_right(lcd);
            lcd.refresh();
            wait(0.3);
        }
        // Preform punch move if user presses button B
        if (buttonB.read() == 1) {
            enemy.sword_right(lcd);  // draw kick on same coordinates as the sprite
            lcd.refresh();
            wait(0.3);
        }
    }
    else if(x > 0.52) { // joystick moved to the left
        enemy.add_x(-5);           // decrement by 5
        enemy.move_left(lcd);
        lcd.refresh();
        wait(0.1);
        enemy.move_left2(lcd);
        lcd.refresh();
        wait(0.08);
    
    
    if (x_pos <= 6) {   // code to stop enemy moving out of lcd screen
            enemy.add_x(5);
        }

    // kick if user presses button A
        if (buttonA.read() == 1) {
            enemy.kick_left(lcd);
            lcd.refresh();
            wait(0.3);
        }
        if (buttonB.read() == 1) {
            enemy.sword_left(lcd);  // draw kick on same coordinates as the sprite
            lcd.refresh();
            wait(0.3);
        }
    }
}