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