James Heavey
/
EL17JH
FINAL VERSION
main.cpp@48:966f2cf803ec, 2019-04-26 (annotated)
- Committer:
- jamesheavey
- Date:
- Fri Apr 26 21:57:09 2019 +0000
- Revision:
- 48:966f2cf803ec
- Parent:
- 47:1d1a827be81b
- Child:
- 49:31eb7807dbd3
adjusted ball collision on top colision with brick. need to add carry over lives and fix the prev score, then do proper menus and clean up the code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jamesheavey | 0:7d4d2023ed9c | 1 | ///////// pre-processor directives //////// |
jamesheavey | 0:7d4d2023ed9c | 2 | #include "mbed.h" |
jamesheavey | 0:7d4d2023ed9c | 3 | #include "Gamepad.h" |
jamesheavey | 0:7d4d2023ed9c | 4 | #include "N5110.h" |
jamesheavey | 27:1b5038b0a7a2 | 5 | #include "BreakoutEngine.h" |
jamesheavey | 3:5719d0fe94ed | 6 | #include "Bitmap.h" |
jamesheavey | 4:6bd488b5b31a | 7 | #include<iostream> |
jamesheavey | 8:1ab6d90c4d60 | 8 | #include "Sprites.h" |
jamesheavey | 14:38560375d420 | 9 | //#include "MotionControl.h" |
jamesheavey | 0:7d4d2023ed9c | 10 | |
jamesheavey | 0:7d4d2023ed9c | 11 | #ifdef WITH_TESTING |
jamesheavey | 0:7d4d2023ed9c | 12 | # include "tests.h" |
jamesheavey | 0:7d4d2023ed9c | 13 | #endif |
jamesheavey | 0:7d4d2023ed9c | 14 | |
jamesheavey | 9:f6f0f39538c7 | 15 | #define PADDLE_WIDTH 15 |
jamesheavey | 0:7d4d2023ed9c | 16 | #define PADDLE_HEIGHT 2 |
jamesheavey | 0:7d4d2023ed9c | 17 | #define BALL_SIZE 2 |
jamesheavey | 0:7d4d2023ed9c | 18 | #define BALL_SPEED 3 |
jamesheavey | 0:7d4d2023ed9c | 19 | |
jamesheavey | 0:7d4d2023ed9c | 20 | /////////////// structs ///////////////// |
jamesheavey | 0:7d4d2023ed9c | 21 | struct UserInput { |
jamesheavey | 0:7d4d2023ed9c | 22 | Direction d; |
jamesheavey | 0:7d4d2023ed9c | 23 | float mag; |
jamesheavey | 0:7d4d2023ed9c | 24 | }; |
jamesheavey | 0:7d4d2023ed9c | 25 | /////////////// objects /////////////// |
jamesheavey | 0:7d4d2023ed9c | 26 | N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); |
jamesheavey | 0:7d4d2023ed9c | 27 | Gamepad pad; |
jamesheavey | 27:1b5038b0a7a2 | 28 | BreakoutEngine breakout; |
jamesheavey | 0:7d4d2023ed9c | 29 | |
jamesheavey | 0:7d4d2023ed9c | 30 | ///////////// prototypes /////////////// |
jamesheavey | 0:7d4d2023ed9c | 31 | void init(); |
jamesheavey | 0:7d4d2023ed9c | 32 | void update_game(UserInput input); |
jamesheavey | 0:7d4d2023ed9c | 33 | void render(); |
jamesheavey | 16:1761dfe801af | 34 | bool welcome(); |
jamesheavey | 10:9f445faa892c | 35 | void end_screen(); |
jamesheavey | 10:9f445faa892c | 36 | void main_menu(); |
jamesheavey | 47:1d1a827be81b | 37 | void main_game(bool tilt); |
jamesheavey | 47:1d1a827be81b | 38 | int i = 0; |
jamesheavey | 47:1d1a827be81b | 39 | int prev_score = 0; |
jamesheavey | 47:1d1a827be81b | 40 | |
jamesheavey | 47:1d1a827be81b | 41 | bool tilt = false; |
jamesheavey | 0:7d4d2023ed9c | 42 | |
jamesheavey | 0:7d4d2023ed9c | 43 | ///////////// functions //////////////// |
jamesheavey | 0:7d4d2023ed9c | 44 | int main() |
jamesheavey | 0:7d4d2023ed9c | 45 | { |
jamesheavey | 0:7d4d2023ed9c | 46 | #ifdef WITH_TESTING |
jamesheavey | 0:7d4d2023ed9c | 47 | int number_of_failures = run_all_tests(); |
jamesheavey | 0:7d4d2023ed9c | 48 | |
jamesheavey | 0:7d4d2023ed9c | 49 | if(number_of_failures > 0) return number_of_failures; |
jamesheavey | 0:7d4d2023ed9c | 50 | #endif |
jamesheavey | 10:9f445faa892c | 51 | main_menu(); |
jamesheavey | 3:5719d0fe94ed | 52 | |
jamesheavey | 0:7d4d2023ed9c | 53 | } |
jamesheavey | 0:7d4d2023ed9c | 54 | |
jamesheavey | 0:7d4d2023ed9c | 55 | // initialies all classes and libraries |
jamesheavey | 47:1d1a827be81b | 56 | void init(int prev_score) |
jamesheavey | 0:7d4d2023ed9c | 57 | { |
jamesheavey | 0:7d4d2023ed9c | 58 | // need to initialise LCD and Gamepad |
jamesheavey | 0:7d4d2023ed9c | 59 | lcd.init(); |
jamesheavey | 0:7d4d2023ed9c | 60 | pad.init(); |
jamesheavey | 0:7d4d2023ed9c | 61 | |
jamesheavey | 0:7d4d2023ed9c | 62 | // initialise the game with correct ball and paddle sizes |
jamesheavey | 47:1d1a827be81b | 63 | breakout.init(PADDLE_WIDTH,PADDLE_HEIGHT,BALL_SIZE,pad.read_pot()*3+2,prev_score); |
jamesheavey | 0:7d4d2023ed9c | 64 | |
jamesheavey | 0:7d4d2023ed9c | 65 | } |
jamesheavey | 0:7d4d2023ed9c | 66 | |
jamesheavey | 0:7d4d2023ed9c | 67 | // this function draws each frame on the LCD |
jamesheavey | 0:7d4d2023ed9c | 68 | void render() |
jamesheavey | 0:7d4d2023ed9c | 69 | { |
jamesheavey | 0:7d4d2023ed9c | 70 | // clear screen, re-draw and refresh |
jamesheavey | 0:7d4d2023ed9c | 71 | lcd.clear(); |
jamesheavey | 26:25eea19c5fbe | 72 | breakout.draw(lcd); |
jamesheavey | 0:7d4d2023ed9c | 73 | lcd.refresh(); |
jamesheavey | 0:7d4d2023ed9c | 74 | } |
jamesheavey | 0:7d4d2023ed9c | 75 | |
jamesheavey | 0:7d4d2023ed9c | 76 | // simple splash screen displayed on start-up |
jamesheavey | 16:1761dfe801af | 77 | bool welcome() { |
jamesheavey | 3:5719d0fe94ed | 78 | Bitmap breakwhite(breakwhite_data, 48, 84); |
jamesheavey | 3:5719d0fe94ed | 79 | Bitmap breakblack(breakblack_data, 48, 84); |
jamesheavey | 0:7d4d2023ed9c | 80 | |
jamesheavey | 0:7d4d2023ed9c | 81 | // wait flashing LEDs until start button is pressed |
jamesheavey | 14:38560375d420 | 82 | //bool joy = true; |
jamesheavey | 14:38560375d420 | 83 | |
jamesheavey | 22:fa2e0b58043a | 84 | while (pad.check_event(Gamepad::L_PRESSED) || pad.check_event(Gamepad::R_PRESSED) || pad.check_event(Gamepad::START_PRESSED) || pad.check_event(Gamepad::BACK_PRESSED)== false) { //maybe add a jingle |
jamesheavey | 3:5719d0fe94ed | 85 | |
jamesheavey | 3:5719d0fe94ed | 86 | breakwhite.render(lcd, 0, 0); |
jamesheavey | 3:5719d0fe94ed | 87 | lcd.refresh(); |
jamesheavey | 0:7d4d2023ed9c | 88 | pad.leds_on(); |
jamesheavey | 3:5719d0fe94ed | 89 | wait(0.5); |
jamesheavey | 14:38560375d420 | 90 | |
jamesheavey | 3:5719d0fe94ed | 91 | lcd.clear(); |
jamesheavey | 14:38560375d420 | 92 | |
jamesheavey | 3:5719d0fe94ed | 93 | breakblack.render(lcd, 0, 0); |
jamesheavey | 3:5719d0fe94ed | 94 | lcd.refresh(); |
jamesheavey | 0:7d4d2023ed9c | 95 | pad.leds_off(); |
jamesheavey | 3:5719d0fe94ed | 96 | wait(0.5); |
jamesheavey | 16:1761dfe801af | 97 | |
jamesheavey | 22:fa2e0b58043a | 98 | if (pad.check_event(Gamepad::L_PRESSED) || pad.check_event(Gamepad::BACK_PRESSED)) { |
jamesheavey | 16:1761dfe801af | 99 | return false; |
jamesheavey | 16:1761dfe801af | 100 | } |
jamesheavey | 22:fa2e0b58043a | 101 | if (pad.check_event(Gamepad::R_PRESSED) || pad.check_event(Gamepad::START_PRESSED)) { |
jamesheavey | 16:1761dfe801af | 102 | return true; |
jamesheavey | 16:1761dfe801af | 103 | } |
jamesheavey | 0:7d4d2023ed9c | 104 | } |
jamesheavey | 16:1761dfe801af | 105 | return false; |
jamesheavey | 10:9f445faa892c | 106 | } |
jamesheavey | 10:9f445faa892c | 107 | |
jamesheavey | 16:1761dfe801af | 108 | |
jamesheavey | 10:9f445faa892c | 109 | void end_screen() { |
jamesheavey | 15:b867a6620f96 | 110 | lcd.clear(); |
jamesheavey | 38:3a077f0259df | 111 | lcd.printString(" RESTART? ",2,2); |
jamesheavey | 15:b867a6620f96 | 112 | lcd.printString(" PRESS START ",1,4); |
jamesheavey | 15:b867a6620f96 | 113 | lcd.refresh(); |
jamesheavey | 15:b867a6620f96 | 114 | pad.tone(750.0,0.3); |
jamesheavey | 15:b867a6620f96 | 115 | wait(0.4); |
jamesheavey | 15:b867a6620f96 | 116 | |
jamesheavey | 15:b867a6620f96 | 117 | pad.tone(300.0,0.3); |
jamesheavey | 15:b867a6620f96 | 118 | wait(0.4); |
jamesheavey | 10:9f445faa892c | 119 | |
jamesheavey | 10:9f445faa892c | 120 | while (pad.check_event(Gamepad::START_PRESSED) == false) { |
jamesheavey | 10:9f445faa892c | 121 | lcd.clear(); |
jamesheavey | 48:966f2cf803ec | 122 | lcd.printString(" RESTART? ",2,2); //print score here |
jamesheavey | 10:9f445faa892c | 123 | lcd.printString(" PRESS START ",1,4); |
jamesheavey | 10:9f445faa892c | 124 | lcd.refresh(); |
jamesheavey | 10:9f445faa892c | 125 | } |
jamesheavey | 10:9f445faa892c | 126 | main_menu(); |
jamesheavey | 10:9f445faa892c | 127 | } |
jamesheavey | 10:9f445faa892c | 128 | |
jamesheavey | 13:418a71b24b37 | 129 | void victory_screen() { |
jamesheavey | 15:b867a6620f96 | 130 | lcd.clear(); |
jamesheavey | 43:81d22f68dfae | 131 | lcd.printString(" VICTORY! ",2,1); |
jamesheavey | 47:1d1a827be81b | 132 | lcd.printString(" CONT = START ",0,4); // print score here |
jamesheavey | 47:1d1a827be81b | 133 | lcd.printString(" MENU = BACK ",0,5); |
jamesheavey | 15:b867a6620f96 | 134 | lcd.refresh(); |
jamesheavey | 22:fa2e0b58043a | 135 | pad.tone(2500.0,0.1); |
jamesheavey | 22:fa2e0b58043a | 136 | wait(0.4); |
jamesheavey | 15:b867a6620f96 | 137 | |
jamesheavey | 22:fa2e0b58043a | 138 | pad.tone(2500.0,0.1); |
jamesheavey | 22:fa2e0b58043a | 139 | wait(0.2); |
jamesheavey | 15:b867a6620f96 | 140 | |
jamesheavey | 15:b867a6620f96 | 141 | pad.tone(4000.0,0.6); |
jamesheavey | 15:b867a6620f96 | 142 | wait(0.6); |
jamesheavey | 43:81d22f68dfae | 143 | while (pad.check_event(Gamepad::START_PRESSED) || pad.check_event(Gamepad::BACK_PRESSED) == false) { |
jamesheavey | 13:418a71b24b37 | 144 | lcd.clear(); |
jamesheavey | 43:81d22f68dfae | 145 | |
jamesheavey | 43:81d22f68dfae | 146 | lcd.printString(" VICTORY! ",2,1); |
jamesheavey | 47:1d1a827be81b | 147 | lcd.printString(" CONT = START ",0,4); |
jamesheavey | 47:1d1a827be81b | 148 | lcd.printString(" MENU = BACK ",0,5); |
jamesheavey | 43:81d22f68dfae | 149 | |
jamesheavey | 13:418a71b24b37 | 150 | lcd.refresh(); |
jamesheavey | 15:b867a6620f96 | 151 | |
jamesheavey | 43:81d22f68dfae | 152 | if (pad.check_event(Gamepad::START_PRESSED)) { |
jamesheavey | 47:1d1a827be81b | 153 | prev_score = breakout.get_prev_score(); |
jamesheavey | 47:1d1a827be81b | 154 | main_game(tilt); // placeholder, change so game restarts |
jamesheavey | 43:81d22f68dfae | 155 | } |
jamesheavey | 43:81d22f68dfae | 156 | else if (pad.check_event(Gamepad::BACK_PRESSED)) { |
jamesheavey | 43:81d22f68dfae | 157 | main_menu(); |
jamesheavey | 43:81d22f68dfae | 158 | } |
jamesheavey | 13:418a71b24b37 | 159 | } |
jamesheavey | 13:418a71b24b37 | 160 | } |
jamesheavey | 13:418a71b24b37 | 161 | |
jamesheavey | 10:9f445faa892c | 162 | void main_menu() { |
jamesheavey | 47:1d1a827be81b | 163 | tilt = false; |
jamesheavey | 47:1d1a827be81b | 164 | prev_score = 0; |
jamesheavey | 47:1d1a827be81b | 165 | init(prev_score); // initialise and then display welcome screen... |
jamesheavey | 16:1761dfe801af | 166 | if (welcome() == true) { |
jamesheavey | 16:1761dfe801af | 167 | tilt = true; |
jamesheavey | 16:1761dfe801af | 168 | } // waiting for the user to start |
jamesheavey | 10:9f445faa892c | 169 | |
jamesheavey | 47:1d1a827be81b | 170 | main_game(tilt); |
jamesheavey | 47:1d1a827be81b | 171 | |
jamesheavey | 47:1d1a827be81b | 172 | } |
jamesheavey | 47:1d1a827be81b | 173 | |
jamesheavey | 47:1d1a827be81b | 174 | void main_game(bool tilt) { |
jamesheavey | 47:1d1a827be81b | 175 | int fps = 8; // frames per second |
jamesheavey | 47:1d1a827be81b | 176 | i ++; //to init the stuff |
jamesheavey | 47:1d1a827be81b | 177 | if (i > 1) { |
jamesheavey | 47:1d1a827be81b | 178 | init(prev_score); |
jamesheavey | 47:1d1a827be81b | 179 | } |
jamesheavey | 47:1d1a827be81b | 180 | bool pause = false; |
jamesheavey | 47:1d1a827be81b | 181 | lcd.setBrightness(1); |
jamesheavey | 47:1d1a827be81b | 182 | |
jamesheavey | 10:9f445faa892c | 183 | Bitmap three(three_data, 48, 84); |
jamesheavey | 10:9f445faa892c | 184 | Bitmap two(two_data, 48, 84); |
jamesheavey | 10:9f445faa892c | 185 | Bitmap one(one_data, 48, 84); |
jamesheavey | 10:9f445faa892c | 186 | |
jamesheavey | 10:9f445faa892c | 187 | lcd.clear(); |
jamesheavey | 10:9f445faa892c | 188 | three.render(lcd, 0, 0); |
jamesheavey | 10:9f445faa892c | 189 | lcd.refresh(); |
jamesheavey | 15:b867a6620f96 | 190 | pad.tone(500.0,0.5); |
jamesheavey | 10:9f445faa892c | 191 | wait(1); |
jamesheavey | 10:9f445faa892c | 192 | |
jamesheavey | 10:9f445faa892c | 193 | lcd.clear(); |
jamesheavey | 10:9f445faa892c | 194 | two.render(lcd, 0, 0); |
jamesheavey | 10:9f445faa892c | 195 | lcd.refresh(); |
jamesheavey | 15:b867a6620f96 | 196 | pad.tone(500.0,0.5); |
jamesheavey | 10:9f445faa892c | 197 | wait(1); |
jamesheavey | 10:9f445faa892c | 198 | |
jamesheavey | 10:9f445faa892c | 199 | lcd.clear(); |
jamesheavey | 10:9f445faa892c | 200 | one.render(lcd, 0, 0); |
jamesheavey | 10:9f445faa892c | 201 | lcd.refresh(); |
jamesheavey | 15:b867a6620f96 | 202 | pad.tone(1000.0,1); |
jamesheavey | 10:9f445faa892c | 203 | wait(1); |
jamesheavey | 10:9f445faa892c | 204 | |
jamesheavey | 10:9f445faa892c | 205 | render(); // first draw the initial frame |
jamesheavey | 10:9f445faa892c | 206 | wait(1.0f/fps); // and wait for one frame period |
jamesheavey | 10:9f445faa892c | 207 | |
jamesheavey | 10:9f445faa892c | 208 | |
jamesheavey | 10:9f445faa892c | 209 | // game loop - read input, update the game state and render the display |
jamesheavey | 10:9f445faa892c | 210 | while (1) { |
jamesheavey | 26:25eea19c5fbe | 211 | breakout.read_input(pad,tilt); |
jamesheavey | 26:25eea19c5fbe | 212 | breakout.update(pad); |
jamesheavey | 10:9f445faa892c | 213 | render(); |
jamesheavey | 26:25eea19c5fbe | 214 | if (breakout.check_goal(pad) == true) { |
jamesheavey | 12:f714a9e8c55b | 215 | lcd.setBrightness(0); |
jamesheavey | 12:f714a9e8c55b | 216 | wait(0.1); |
jamesheavey | 12:f714a9e8c55b | 217 | lcd.setBrightness(1); |
jamesheavey | 12:f714a9e8c55b | 218 | wait(0.1); |
jamesheavey | 12:f714a9e8c55b | 219 | lcd.setBrightness(0); |
jamesheavey | 12:f714a9e8c55b | 220 | wait(0.1); |
jamesheavey | 12:f714a9e8c55b | 221 | lcd.setBrightness(1); |
jamesheavey | 12:f714a9e8c55b | 222 | wait(0.1); |
jamesheavey | 12:f714a9e8c55b | 223 | lcd.setBrightness(0); |
jamesheavey | 12:f714a9e8c55b | 224 | wait(0.1); |
jamesheavey | 12:f714a9e8c55b | 225 | lcd.setBrightness(1); |
jamesheavey | 12:f714a9e8c55b | 226 | wait(0.1); |
jamesheavey | 12:f714a9e8c55b | 227 | lcd.setBrightness(0); |
jamesheavey | 12:f714a9e8c55b | 228 | wait(0.1); |
jamesheavey | 12:f714a9e8c55b | 229 | lcd.setBrightness(1); |
jamesheavey | 12:f714a9e8c55b | 230 | } |
jamesheavey | 10:9f445faa892c | 231 | if (pad.check_event(Gamepad::BACK_PRESSED) == true) { |
jamesheavey | 10:9f445faa892c | 232 | pause = !pause; |
jamesheavey | 10:9f445faa892c | 233 | } |
jamesheavey | 10:9f445faa892c | 234 | while (pause == true) { |
jamesheavey | 10:9f445faa892c | 235 | lcd.clear(); |
jamesheavey | 10:9f445faa892c | 236 | lcd.printString(" PAUSED ",0,2); |
jamesheavey | 10:9f445faa892c | 237 | lcd.refresh(); |
jamesheavey | 10:9f445faa892c | 238 | if (pad.check_event(Gamepad::BACK_PRESSED) == true) { |
jamesheavey | 10:9f445faa892c | 239 | pause = !pause; |
jamesheavey | 10:9f445faa892c | 240 | } |
jamesheavey | 10:9f445faa892c | 241 | wait(1.0f/fps); |
jamesheavey | 10:9f445faa892c | 242 | } |
jamesheavey | 26:25eea19c5fbe | 243 | if (breakout.get_lives() == 0) { |
jamesheavey | 10:9f445faa892c | 244 | //if (end_screen() == true) { |
jamesheavey | 10:9f445faa892c | 245 | // main_menu(); |
jamesheavey | 10:9f445faa892c | 246 | //} |
jamesheavey | 10:9f445faa892c | 247 | //else { |
jamesheavey | 10:9f445faa892c | 248 | // main_menu(); |
jamesheavey | 10:9f445faa892c | 249 | //} |
jamesheavey | 14:38560375d420 | 250 | pad.leds_off(); //turns last led off (doesnt run through and update bored so last led doent turn off via lives leds |
jamesheavey | 10:9f445faa892c | 251 | end_screen(); |
jamesheavey | 10:9f445faa892c | 252 | } |
jamesheavey | 26:25eea19c5fbe | 253 | if (breakout.get_num_left() == 0) { |
jamesheavey | 13:418a71b24b37 | 254 | victory_screen(); |
jamesheavey | 13:418a71b24b37 | 255 | } |
jamesheavey | 10:9f445faa892c | 256 | wait(1.0f/fps); |
jamesheavey | 10:9f445faa892c | 257 | } |
jamesheavey | 10:9f445faa892c | 258 | } |
jamesheavey | 10:9f445faa892c | 259 |