Mortal Kombat Game ELEC2645

Dependencies:   mbed N5110 ShiftReg Joystick

Committer:
ozy
Date:
Fri May 07 16:58:36 2021 +0000
Revision:
20:4ca04fd0965a
Parent:
19:6c63e1dd7c85
Child:
21:fad1c9f010d1
Before changing to seamless version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ozy 6:a1a7dc264fed 1 #include "GameEngine.h"
ozy 6:a1a7dc264fed 2
ozy 6:a1a7dc264fed 3 GameEngine::GameEngine() {}
ozy 6:a1a7dc264fed 4
ozy 19:6c63e1dd7c85 5 void GameEngine::init(){
ozy 18:22bda659c70a 6 _enemy.init();
ozy 7:737fb0c3dbef 7 _fighter.init();
ozy 19:6c63e1dd7c85 8 set_fighter_health(40);
ozy 19:6c63e1dd7c85 9 set_enemy_health(40);
ozy 20:4ca04fd0965a 10 // buttonA.rise(&buttonA_isr)
ozy 20:4ca04fd0965a 11 // buttonA.mode
ozy 20:4ca04fd0965a 12 // button.
ozy 18:22bda659c70a 13 }
ozy 18:22bda659c70a 14
ozy 18:22bda659c70a 15 int GameEngine::get_fighter_health() {
ozy 18:22bda659c70a 16 return _fighter_health;
ozy 18:22bda659c70a 17 }
ozy 18:22bda659c70a 18
ozy 18:22bda659c70a 19 int GameEngine::get_enemy_health() {
ozy 18:22bda659c70a 20 return _enemy_health;
ozy 18:22bda659c70a 21 }
ozy 18:22bda659c70a 22
ozy 18:22bda659c70a 23 void GameEngine::set_fighter_health(int fighter_health) {
ozy 18:22bda659c70a 24 _fighter_health = fighter_health;
ozy 18:22bda659c70a 25 }
ozy 18:22bda659c70a 26
ozy 18:22bda659c70a 27 void GameEngine::set_enemy_health(int enemy_health) {
ozy 18:22bda659c70a 28 _enemy_health = enemy_health;
ozy 18:22bda659c70a 29 }
ozy 18:22bda659c70a 30
ozy 18:22bda659c70a 31 void GameEngine::reduce_f_health(int fighter_health) {
ozy 18:22bda659c70a 32 _fighter_health -= fighter_health;
ozy 18:22bda659c70a 33 }
ozy 18:22bda659c70a 34
ozy 18:22bda659c70a 35 void GameEngine::reduce_e_health(int enemy_health) {
ozy 18:22bda659c70a 36 _enemy_health -= enemy_health;
ozy 6:a1a7dc264fed 37 }
ozy 6:a1a7dc264fed 38
ozy 19:6c63e1dd7c85 39 void GameEngine::draw_health_bars(N5110 &lcd) {
ozy 19:6c63e1dd7c85 40 int F = get_fighter_health();
ozy 19:6c63e1dd7c85 41 int E = get_enemy_health();
ozy 19:6c63e1dd7c85 42
ozy 19:6c63e1dd7c85 43 if (F < 0) { // if fighter loses
ozy 19:6c63e1dd7c85 44 F = 0; // F = 0 to avoid fighter health bar front-tracking into the enemy bar
ozy 19:6c63e1dd7c85 45 game_over(lcd); // game over!
ozy 19:6c63e1dd7c85 46 }
ozy 19:6c63e1dd7c85 47 else if(E < 0) { // if enemy loses
ozy 19:6c63e1dd7c85 48 E = 0; // E = 0 to avoid enemy health bar back-tracking into fighter health bat
ozy 19:6c63e1dd7c85 49 game_over(lcd);
ozy 19:6c63e1dd7c85 50 // finish_him(); // finish him feature
ozy 19:6c63e1dd7c85 51 }
ozy 19:6c63e1dd7c85 52 lcd.printString("You", 0,1);
ozy 19:6c63e1dd7c85 53 lcd.printString("Enemy", 55,1); // Kotal Khan is too long to be right-aligned so we have to write Enemy! :(
ozy 19:6c63e1dd7c85 54 lcd.drawRect(0,0,F, 5, FILL_BLACK);
ozy 19:6c63e1dd7c85 55 lcd.drawRect(0,0,40, 5, FILL_TRANSPARENT);
ozy 19:6c63e1dd7c85 56 // ------------------------------------------------
ozy 19:6c63e1dd7c85 57 lcd.drawRect(44,0, E, 5, FILL_BLACK);
ozy 19:6c63e1dd7c85 58 lcd.drawRect(44,0,40, 5, FILL_TRANSPARENT);
ozy 19:6c63e1dd7c85 59 }
ozy 19:6c63e1dd7c85 60
ozy 7:737fb0c3dbef 61 void GameEngine::start(N5110 &lcd, DigitalIn &buttonA, DigitalIn &buttonB, DigitalIn &buttonC, DigitalIn &buttonD, AnalogIn &joy_v, AnalogIn &joy_h) {
ozy 19:6c63e1dd7c85 62 // function that draws fighter and allows user to control it
ozy 19:6c63e1dd7c85 63 _fighter.move_fighter(lcd, buttonA, buttonB, buttonC, buttonD, joy_v, joy_h);
ozy 15:7fd2d34f3be5 64 // initializing and drawing enemy AI agent
ozy 12:b4477a312158 65 enemy_AI(lcd);
ozy 19:6c63e1dd7c85 66 draw_health_bars(lcd);
ozy 18:22bda659c70a 67 int fighter_health = get_fighter_health();
ozy 18:22bda659c70a 68 int enemy_health = get_enemy_health();
ozy 18:22bda659c70a 69 int collision = check_collision(lcd, buttonA, buttonB, buttonC);
ozy 20:4ca04fd0965a 70 if (collision == 0) { // fighter hit
ozy 20:4ca04fd0965a 71 reduce_f_health(1); // reduce fighter health
ozy 18:22bda659c70a 72 printf("fighter health = %i\n", fighter_health);
ozy 18:22bda659c70a 73 }
ozy 20:4ca04fd0965a 74 else if (collision == 1) { // enemy hit
ozy 20:4ca04fd0965a 75 reduce_e_health(1); // reduce enemy health
ozy 18:22bda659c70a 76 printf("enemy health = %i\n", enemy_health);
ozy 18:22bda659c70a 77 }
ozy 7:737fb0c3dbef 78 lcd.refresh();
ozy 7:737fb0c3dbef 79 }
ozy 7:737fb0c3dbef 80
ozy 8:e2e2eb4ea0ca 81 void GameEngine::enemy_AI(N5110 &lcd) {
ozy 8:e2e2eb4ea0ca 82 int fighter_pos = _fighter.get_x();
ozy 17:928edcdd1058 83 //printf("f pos = %i \n", fighter_pos);
ozy 8:e2e2eb4ea0ca 84 int enemy_pos = _enemy.get_x();
ozy 17:928edcdd1058 85 //printf("e pos = %i \n", enemy_pos);
ozy 8:e2e2eb4ea0ca 86 int input = 0;
ozy 8:e2e2eb4ea0ca 87 int diff = fighter_pos - enemy_pos;
ozy 17:928edcdd1058 88 // printf("diff = %i \n", diff);
ozy 12:b4477a312158 89 // if difference is positive, fighter is to the right so enemy must look right (if input is 1, enemy looks right) and vice versa
ozy 8:e2e2eb4ea0ca 90 if (diff > 0) {
ozy 8:e2e2eb4ea0ca 91 input = 1;
ozy 8:e2e2eb4ea0ca 92 }
ozy 8:e2e2eb4ea0ca 93 else {input = 0;}
ozy 16:4a1d916d97c5 94 if (diff >= -10 && diff <= 10){ // randomize enemy fight moves only in fighting range
ozy 14:7f23841685ad 95 _enemy.draw(lcd, input);
ozy 12:b4477a312158 96 _enemy.randomize_moves(lcd, input);
ozy 13:eaf070d5f599 97 // check for collision (without guard ON)
ozy 13:eaf070d5f599 98 // function to reduce enemy health or fighter health
ozy 16:4a1d916d97c5 99 // check_end_of_game
ozy 12:b4477a312158 100 }
ozy 14:7f23841685ad 101 // code for enemy to move to fighter if he is to the right
ozy 17:928edcdd1058 102 else if ((enemy_pos < fighter_pos) && (diff > 10) && (rand()%2 > 0)) {
ozy 14:7f23841685ad 103 _enemy.add_x(5);
ozy 14:7f23841685ad 104 _enemy.move_right(lcd);
ozy 14:7f23841685ad 105 }
ozy 14:7f23841685ad 106 // code for enemy to move to fighter if he is to the left
ozy 17:928edcdd1058 107 else if ((enemy_pos > fighter_pos) && (diff < 10) && (rand()%2 > 0)) {
ozy 14:7f23841685ad 108 _enemy.add_x(-5);
ozy 13:eaf070d5f599 109 _enemy.move_left(lcd);
ozy 13:eaf070d5f599 110 }
ozy 14:7f23841685ad 111 else {
ozy 14:7f23841685ad 112 _enemy.draw(lcd, input);
ozy 13:eaf070d5f599 113 }
ozy 8:e2e2eb4ea0ca 114 }
ozy 15:7fd2d34f3be5 115
ozy 18:22bda659c70a 116 int GameEngine::check_collision(N5110 &lcd, DigitalIn &buttonA, DigitalIn &buttonB, DigitalIn &buttonC) {
ozy 16:4a1d916d97c5 117 int fighter_pos = _fighter.get_x();
ozy 16:4a1d916d97c5 118 int enemy_pos = _enemy.get_x();
ozy 16:4a1d916d97c5 119 int diff = fighter_pos - enemy_pos;
ozy 16:4a1d916d97c5 120 int input;
ozy 18:22bda659c70a 121 int collision;
ozy 16:4a1d916d97c5 122 if (diff > 0) {
ozy 16:4a1d916d97c5 123 input = 1;
ozy 16:4a1d916d97c5 124 }
ozy 16:4a1d916d97c5 125 else {input = 0;}
ozy 16:4a1d916d97c5 126 int fighter_y = _fighter.get_y(); // getting fighter y pos to avoid enemy hitting fighter while fighter is above him
ozy 16:4a1d916d97c5 127 // code to check enemy collision
ozy 16:4a1d916d97c5 128 // check in fight range check enemy fight move check fighter is not guarding check fighter is on gound
ozy 17:928edcdd1058 129 if ((diff >= -10 && diff <= 10) && (_enemy.randomize_moves(lcd, input) == 1) && (buttonC.read() != 1) && (fighter_y == 34)) {
ozy 18:22bda659c70a 130 printf("enemy collision detected!\n");
ozy 18:22bda659c70a 131 collision = 0;
ozy 16:4a1d916d97c5 132 }
ozy 16:4a1d916d97c5 133 // code to check fight collision
ozy 17:928edcdd1058 134 // check in fight range check if kick or fight move is performed
ozy 17:928edcdd1058 135 if ((diff >= -10 && diff <= 10) && ((buttonA.read() || buttonB.read()) == 1)) {
ozy 18:22bda659c70a 136 printf("fighter collision detected!\n");
ozy 18:22bda659c70a 137 collision = 1;
ozy 17:928edcdd1058 138 }
ozy 18:22bda659c70a 139 // printf("collision is %i\n", collision);
ozy 18:22bda659c70a 140 return collision;
ozy 13:eaf070d5f599 141 }
ozy 8:e2e2eb4ea0ca 142
ozy 18:22bda659c70a 143
ozy 19:6c63e1dd7c85 144 void GameEngine::game_over(N5110 &lcd) {
ozy 19:6c63e1dd7c85 145 lcd.clear();
ozy 20:4ca04fd0965a 146 lcd.printString("Game Over", 18, 3);
ozy 19:6c63e1dd7c85 147 lcd.refresh();
ozy 19:6c63e1dd7c85 148 }
ozy 18:22bda659c70a 149