Mortal Kombat Game ELEC2645
Dependencies: mbed N5110 ShiftReg Joystick
main.cpp@1:3bdadf6f6dbd, 2021-04-17 (annotated)
- Committer:
- ozy
- Date:
- Sat Apr 17 11:38:39 2021 +0000
- Revision:
- 1:3bdadf6f6dbd
- Parent:
- 0:99b49fd71085
- Child:
- 2:1703eb2a68f8
Code Before adding interrupts
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ozy | 0:99b49fd71085 | 1 | ///////////// includes ///////////////////// |
ozy | 0:99b49fd71085 | 2 | #include "mbed.h" |
ozy | 0:99b49fd71085 | 3 | #include "N5110.h" |
ozy | 0:99b49fd71085 | 4 | #include "Fighter.h" |
ozy | 0:99b49fd71085 | 5 | #include "Joystick.h" |
ozy | 0:99b49fd71085 | 6 | #include "Menu.h" |
ozy | 1:3bdadf6f6dbd | 7 | #include "Enemy.h" |
ozy | 0:99b49fd71085 | 8 | ///////////// defines ///////////////////// |
ozy | 0:99b49fd71085 | 9 | #define SPEED -69 |
ozy | 0:99b49fd71085 | 10 | #define GROUND 34 |
ozy | 0:99b49fd71085 | 11 | ///////////// objects /////////////////// |
ozy | 0:99b49fd71085 | 12 | Fighter fighter; |
ozy | 0:99b49fd71085 | 13 | Menu menu; |
ozy | 1:3bdadf6f6dbd | 14 | Enemy enemy; |
ozy | 0:99b49fd71085 | 15 | DigitalIn buttonA(p29); |
ozy | 0:99b49fd71085 | 16 | DigitalIn buttonB(p28); |
ozy | 0:99b49fd71085 | 17 | DigitalIn buttonC(p27); |
ozy | 0:99b49fd71085 | 18 | DigitalIn buttonD(p26); |
ozy | 0:99b49fd71085 | 19 | AnalogIn joy_v(p20); |
ozy | 0:99b49fd71085 | 20 | AnalogIn joy_h(p19); |
ozy | 0:99b49fd71085 | 21 | N5110 lcd(p14,p8,p9,p10,p11,p13,p21); |
ozy | 0:99b49fd71085 | 22 | BusOut leds(LED4,LED3,LED2,LED1); |
ozy | 0:99b49fd71085 | 23 | Serial pc(USBTX, USBRX); |
ozy | 0:99b49fd71085 | 24 | //////////// functions //////////////////// |
ozy | 0:99b49fd71085 | 25 | void init(); |
ozy | 0:99b49fd71085 | 26 | void menu_screen(); |
ozy | 0:99b49fd71085 | 27 | void move_sprite(); |
ozy | 0:99b49fd71085 | 28 | void draw_background(); |
ozy | 1:3bdadf6f6dbd | 29 | void move_enemy(); |
ozy | 1:3bdadf6f6dbd | 30 | int get_user_input(int &input); |
ozy | 1:3bdadf6f6dbd | 31 | |
ozy | 0:99b49fd71085 | 32 | |
ozy | 0:99b49fd71085 | 33 | |
ozy | 0:99b49fd71085 | 34 | int main() { |
ozy | 0:99b49fd71085 | 35 | init(); |
ozy | 1:3bdadf6f6dbd | 36 | menu_screen(); |
ozy | 1:3bdadf6f6dbd | 37 | int input; |
ozy | 0:99b49fd71085 | 38 | while(1) { |
ozy | 1:3bdadf6f6dbd | 39 | // lcd.clear(); |
ozy | 1:3bdadf6f6dbd | 40 | // draw_background(); |
ozy | 1:3bdadf6f6dbd | 41 | // move_enemy(); |
ozy | 1:3bdadf6f6dbd | 42 | // move_sprite(); |
ozy | 1:3bdadf6f6dbd | 43 | get_user_input(input); |
ozy | 0:99b49fd71085 | 44 | } |
ozy | 0:99b49fd71085 | 45 | } |
ozy | 0:99b49fd71085 | 46 | |
ozy | 0:99b49fd71085 | 47 | void init() { // initialize all devices |
ozy | 0:99b49fd71085 | 48 | lcd.init(); |
ozy | 0:99b49fd71085 | 49 | lcd.setContrast(0.5); |
ozy | 0:99b49fd71085 | 50 | } |
ozy | 0:99b49fd71085 | 51 | |
ozy | 0:99b49fd71085 | 52 | void menu_screen() { |
ozy | 0:99b49fd71085 | 53 | menu.main_menu(lcd); // printing the menu screen |
ozy | 0:99b49fd71085 | 54 | wait(3.5f); |
ozy | 0:99b49fd71085 | 55 | menu.created_by(lcd); // 2nd menu screen |
ozy | 0:99b49fd71085 | 56 | wait(3.5f); |
ozy | 1:3bdadf6f6dbd | 57 | menu.homescreen(lcd); // print homescreen |
ozy | 1:3bdadf6f6dbd | 58 | menu.menu_selection(lcd, buttonA, buttonB, buttonC, buttonD); // function to ask user to select menu item |
ozy | 0:99b49fd71085 | 59 | } |
ozy | 0:99b49fd71085 | 60 | |
ozy | 0:99b49fd71085 | 61 | |
ozy | 0:99b49fd71085 | 62 | void draw_background() { |
ozy | 0:99b49fd71085 | 63 | // lcd.drawLine(x1, y1, x2, y2, type); |
ozy | 0:99b49fd71085 | 64 | lcd.drawLine(0,46,82,46,1); // draws ground platform |
ozy | 0:99b49fd71085 | 65 | lcd.drawLine(0,46,0,25,1); // draws first side wall |
ozy | 0:99b49fd71085 | 66 | lcd.drawLine(82,46,82,25,1); // draws second side wall |
ozy | 0:99b49fd71085 | 67 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 68 | } |
ozy | 0:99b49fd71085 | 69 | |
ozy | 0:99b49fd71085 | 70 | |
ozy | 0:99b49fd71085 | 71 | void move_sprite() { |
ozy | 0:99b49fd71085 | 72 | // getting joystick coordinates using read() function |
ozy | 0:99b49fd71085 | 73 | // joystick centered at (0.50,0.50) with utmost left at (1.00,0.50) and utmost right being (0.00,0.50) |
ozy | 0:99b49fd71085 | 74 | |
ozy | 0:99b49fd71085 | 75 | // read each of the pins |
ozy | 0:99b49fd71085 | 76 | float x = joy_h.read(); |
ozy | 0:99b49fd71085 | 77 | float y = joy_v.read(); |
ozy | 0:99b49fd71085 | 78 | printf("x = %.2f | y = %.2f \n",x,y); |
ozy | 0:99b49fd71085 | 79 | /* |
ozy | 0:99b49fd71085 | 80 | Code idea: |
ozy | 0:99b49fd71085 | 81 | if joystick is not moved , display standing sprite |
ozy | 0:99b49fd71085 | 82 | if joystick is moved right, toggle between runright and midrunright |
ozy | 0:99b49fd71085 | 83 | if joystick is moved left, toggle between runleft and midrunleft |
ozy | 0:99b49fd71085 | 84 | */ |
ozy | 1:3bdadf6f6dbd | 85 | if(x > 0.48 && x < 0.52) { // joystick not moved - we use ± 0.05 to take account of fluctuation in joystick tolerance and noice on ADC |
ozy | 0:99b49fd71085 | 86 | fighter.draw(lcd, x+33, GROUND); // draw standing fighter and add 30 print it on middle of lcd screen |
ozy | 0:99b49fd71085 | 87 | // ... and the y-coordinate to place sprite exactly on ground is 34 ( 46 - 12(height of sprite) = 34 ) |
ozy | 0:99b49fd71085 | 88 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 89 | wait(0.2); |
ozy | 0:99b49fd71085 | 90 | |
ozy | 0:99b49fd71085 | 91 | // Preform kick move if user presses button A |
ozy | 0:99b49fd71085 | 92 | while (buttonA.read() == 1) { |
ozy | 0:99b49fd71085 | 93 | fighter.kick_right(lcd, x+33, GROUND); // draw kick on same coordinates as the standing sprite |
ozy | 0:99b49fd71085 | 94 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 95 | wait(0.2); |
ozy | 0:99b49fd71085 | 96 | } |
ozy | 0:99b49fd71085 | 97 | // Preform punch move if user presses button B |
ozy | 0:99b49fd71085 | 98 | while (buttonB.read() == 1) { |
ozy | 0:99b49fd71085 | 99 | fighter.punch_right(lcd, x+33, GROUND); // draw kick on same coordinates as the standing sprite |
ozy | 0:99b49fd71085 | 100 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 101 | wait(0.2); |
ozy | 0:99b49fd71085 | 102 | } |
ozy | 0:99b49fd71085 | 103 | // Guard if user presses button C |
ozy | 0:99b49fd71085 | 104 | while (buttonC.read() == 1) { |
ozy | 0:99b49fd71085 | 105 | fighter.guard(lcd, x+33, GROUND); // draw guard move on same coordinates as the standing sprite |
ozy | 0:99b49fd71085 | 106 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 107 | wait(0.2); |
ozy | 0:99b49fd71085 | 108 | } |
ozy | 0:99b49fd71085 | 109 | // Jump if user presses button D |
ozy | 0:99b49fd71085 | 110 | while (buttonD.read() == 1) { |
ozy | 0:99b49fd71085 | 111 | fighter.draw(lcd, x+33, GROUND-15); // adding 15 the sprite y-coordinate to create jump move |
ozy | 0:99b49fd71085 | 112 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 113 | wait(0.2); |
ozy | 0:99b49fd71085 | 114 | } |
ozy | 0:99b49fd71085 | 115 | } |
ozy | 1:3bdadf6f6dbd | 116 | else if(x < 0.48) { // joystick moved to the right |
ozy | 0:99b49fd71085 | 117 | // print the move_right animation, refresh, then print the 2nd move_right animation (toggling animations to create moving legs!) |
ozy | 0:99b49fd71085 | 118 | fighter.move_right(lcd, SPEED*x+70, GROUND); // draw standing fighter, multiply by speed -69 (negative to correct for direction!) |
ozy | 0:99b49fd71085 | 119 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 120 | wait(0.1); |
ozy | 0:99b49fd71085 | 121 | fighter.move_right2(lcd, SPEED*x+70, GROUND); |
ozy | 0:99b49fd71085 | 122 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 123 | wait(0.08); |
ozy | 0:99b49fd71085 | 124 | |
ozy | 0:99b49fd71085 | 125 | // kick if user presses button A |
ozy | 0:99b49fd71085 | 126 | while (buttonA.read() == 1) { |
ozy | 0:99b49fd71085 | 127 | fighter.kick_right(lcd, SPEED*x+70, GROUND); |
ozy | 0:99b49fd71085 | 128 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 129 | wait(0.2); |
ozy | 0:99b49fd71085 | 130 | } |
ozy | 0:99b49fd71085 | 131 | // Preform punch move if user presses button B |
ozy | 0:99b49fd71085 | 132 | while (buttonB.read() == 1) { |
ozy | 0:99b49fd71085 | 133 | fighter.punch_right(lcd, SPEED*x+70, GROUND); // draw kick on same coordinates as the sprite |
ozy | 0:99b49fd71085 | 134 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 135 | wait(0.2); |
ozy | 0:99b49fd71085 | 136 | } |
ozy | 0:99b49fd71085 | 137 | // Guard if user presses button C |
ozy | 0:99b49fd71085 | 138 | while (buttonC.read() == 1) { |
ozy | 0:99b49fd71085 | 139 | fighter.guard(lcd, SPEED*x+70, GROUND); // draw kick on same coordinates as the sprite |
ozy | 0:99b49fd71085 | 140 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 141 | wait(0.2); |
ozy | 0:99b49fd71085 | 142 | } |
ozy | 0:99b49fd71085 | 143 | } |
ozy | 1:3bdadf6f6dbd | 144 | else if(x > 0.52) { // joystick moved to the left |
ozy | 0:99b49fd71085 | 145 | fighter.move_left(lcd, SPEED*x+71, GROUND); |
ozy | 1:3bdadf6f6dbd | 146 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 147 | wait(0.1); |
ozy | 1:3bdadf6f6dbd | 148 | fighter.move_left2(lcd, SPEED*x+71, 34); |
ozy | 0:99b49fd71085 | 149 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 150 | wait(0.08); |
ozy | 0:99b49fd71085 | 151 | } |
ozy | 0:99b49fd71085 | 152 | |
ozy | 0:99b49fd71085 | 153 | // kick if user presses button A |
ozy | 0:99b49fd71085 | 154 | while (buttonA.read() == 1) { |
ozy | 0:99b49fd71085 | 155 | fighter.kick_left(lcd, SPEED*x+71, GROUND); |
ozy | 0:99b49fd71085 | 156 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 157 | wait(0.2); |
ozy | 0:99b49fd71085 | 158 | } |
ozy | 0:99b49fd71085 | 159 | while (buttonB.read() == 1) { |
ozy | 0:99b49fd71085 | 160 | fighter.punch_left(lcd, SPEED*x+71, GROUND); // draw kick on same coordinates as the sprite |
ozy | 0:99b49fd71085 | 161 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 162 | wait(0.2); |
ozy | 0:99b49fd71085 | 163 | } |
ozy | 0:99b49fd71085 | 164 | // Guard if user presses button C |
ozy | 0:99b49fd71085 | 165 | while (buttonC.read() == 1) { |
ozy | 0:99b49fd71085 | 166 | fighter.guard(lcd, SPEED*x+71, GROUND); // draw kick on same coordinates as the sprite |
ozy | 0:99b49fd71085 | 167 | lcd.refresh(); |
ozy | 0:99b49fd71085 | 168 | wait(0.2); |
ozy | 0:99b49fd71085 | 169 | } |
ozy | 0:99b49fd71085 | 170 | } |
ozy | 0:99b49fd71085 | 171 | |
ozy | 1:3bdadf6f6dbd | 172 | void move_enemy() { |
ozy | 1:3bdadf6f6dbd | 173 | // read each of the pins |
ozy | 1:3bdadf6f6dbd | 174 | float x = joy_h.read(); |
ozy | 1:3bdadf6f6dbd | 175 | float y = joy_v.read(); |
ozy | 1:3bdadf6f6dbd | 176 | printf("x = %.2f | y = %.2f \n",x,y); |
ozy | 1:3bdadf6f6dbd | 177 | |
ozy | 1:3bdadf6f6dbd | 178 | if(x > 0.48 && x < 0.52) { // joystick not moved - we use ± 0.05 to take account of fluctuation in joystick tolerance and noice on ADC |
ozy | 1:3bdadf6f6dbd | 179 | enemy.draw(lcd, x+33, GROUND); // draw standing fighter and add 30 print it on middle of lcd screen |
ozy | 1:3bdadf6f6dbd | 180 | // ... and the y-coordinate to place sprite exactly on ground is 34 ( 46 - 12(height of sprite) = 34 ) |
ozy | 1:3bdadf6f6dbd | 181 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 182 | wait(0.2); |
ozy | 1:3bdadf6f6dbd | 183 | // Preform kick move if user presses button A |
ozy | 1:3bdadf6f6dbd | 184 | while (buttonA.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 185 | enemy.kick_right(lcd, x+33, GROUND); // draw kick on same coordinates as the standing sprite |
ozy | 1:3bdadf6f6dbd | 186 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 187 | wait(0.2); |
ozy | 1:3bdadf6f6dbd | 188 | } |
ozy | 1:3bdadf6f6dbd | 189 | // Preform punch move if user presses button B |
ozy | 1:3bdadf6f6dbd | 190 | while (buttonB.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 191 | enemy.sword_right(lcd, x+33, GROUND); // draw kick on same coordinates as the standing sprite |
ozy | 1:3bdadf6f6dbd | 192 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 193 | wait(0.2); |
ozy | 1:3bdadf6f6dbd | 194 | } |
ozy | 1:3bdadf6f6dbd | 195 | } |
ozy | 1:3bdadf6f6dbd | 196 | else if(x < 0.48) { // joystick moved to the right |
ozy | 1:3bdadf6f6dbd | 197 | // print the move_right animation, refresh, then print the 2nd move_right animation (toggling animations to create moving legs!) |
ozy | 1:3bdadf6f6dbd | 198 | enemy.move_right(lcd, SPEED*x+70, GROUND); // draw standing fighter, multiply by speed -69 (negative to correct for direction!) |
ozy | 1:3bdadf6f6dbd | 199 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 200 | wait(0.1); |
ozy | 1:3bdadf6f6dbd | 201 | enemy.move_right2(lcd, SPEED*x+70, GROUND); |
ozy | 1:3bdadf6f6dbd | 202 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 203 | wait(0.08); |
ozy | 1:3bdadf6f6dbd | 204 | |
ozy | 1:3bdadf6f6dbd | 205 | // kick if user presses button A |
ozy | 1:3bdadf6f6dbd | 206 | while (buttonA.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 207 | enemy.kick_right(lcd, SPEED*x+70, GROUND); |
ozy | 1:3bdadf6f6dbd | 208 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 209 | wait(0.2); |
ozy | 1:3bdadf6f6dbd | 210 | } |
ozy | 1:3bdadf6f6dbd | 211 | // Preform punch move if user presses button B |
ozy | 1:3bdadf6f6dbd | 212 | while (buttonB.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 213 | enemy.sword_right(lcd, SPEED*x+70, GROUND); // draw kick on same coordinates as the sprite |
ozy | 1:3bdadf6f6dbd | 214 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 215 | wait(0.2); |
ozy | 1:3bdadf6f6dbd | 216 | } |
ozy | 1:3bdadf6f6dbd | 217 | } |
ozy | 1:3bdadf6f6dbd | 218 | else if(x > 0.52) { // joystick moved to the left |
ozy | 1:3bdadf6f6dbd | 219 | enemy.move_left(lcd, SPEED*x+71, GROUND); |
ozy | 1:3bdadf6f6dbd | 220 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 221 | wait(0.1); |
ozy | 1:3bdadf6f6dbd | 222 | enemy.move_left2(lcd, SPEED*x+71, 34); |
ozy | 1:3bdadf6f6dbd | 223 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 224 | wait(0.08); |
ozy | 1:3bdadf6f6dbd | 225 | } |
ozy | 1:3bdadf6f6dbd | 226 | |
ozy | 1:3bdadf6f6dbd | 227 | // kick if user presses button A |
ozy | 1:3bdadf6f6dbd | 228 | while (buttonA.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 229 | enemy.kick_left(lcd, SPEED*x+71, GROUND); |
ozy | 1:3bdadf6f6dbd | 230 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 231 | wait(0.2); |
ozy | 1:3bdadf6f6dbd | 232 | } |
ozy | 1:3bdadf6f6dbd | 233 | while (buttonB.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 234 | enemy.sword_left(lcd, SPEED*x+71, GROUND); // draw kick on same coordinates as the sprite |
ozy | 1:3bdadf6f6dbd | 235 | lcd.refresh(); |
ozy | 1:3bdadf6f6dbd | 236 | wait(0.2); |
ozy | 1:3bdadf6f6dbd | 237 | } |
ozy | 0:99b49fd71085 | 238 | } |
ozy | 0:99b49fd71085 | 239 | |
ozy | 1:3bdadf6f6dbd | 240 | int get_user_input(int &input) { |
ozy | 1:3bdadf6f6dbd | 241 | while (1) { |
ozy | 1:3bdadf6f6dbd | 242 | if (buttonA.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 243 | input = 1; |
ozy | 1:3bdadf6f6dbd | 244 | break; |
ozy | 1:3bdadf6f6dbd | 245 | } |
ozy | 1:3bdadf6f6dbd | 246 | if (buttonB.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 247 | input = 2; |
ozy | 1:3bdadf6f6dbd | 248 | break; |
ozy | 1:3bdadf6f6dbd | 249 | } |
ozy | 1:3bdadf6f6dbd | 250 | if (buttonC.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 251 | input = 3; |
ozy | 1:3bdadf6f6dbd | 252 | break; |
ozy | 1:3bdadf6f6dbd | 253 | } |
ozy | 1:3bdadf6f6dbd | 254 | if (buttonD.read() == 1) { |
ozy | 1:3bdadf6f6dbd | 255 | input = 4; |
ozy | 1:3bdadf6f6dbd | 256 | break; |
ozy | 1:3bdadf6f6dbd | 257 | } |
ozy | 1:3bdadf6f6dbd | 258 | } |
ozy | 1:3bdadf6f6dbd | 259 | printf("input is %i", input); |
ozy | 1:3bdadf6f6dbd | 260 | return input; |
ozy | 0:99b49fd71085 | 261 | } |
ozy | 1:3bdadf6f6dbd | 262 | |
ozy | 1:3bdadf6f6dbd | 263 |