FINAL VERSION

Dependencies:   mbed

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?

UserRevisionLine numberNew 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