FINAL VERSION

Dependencies:   mbed

Committer:
jamesheavey
Date:
Fri Apr 26 21:43:55 2019 +0000
Revision:
47:1d1a827be81b
Parent:
44:51b94cdded8c
Child:
48:966f2cf803ec
print score on victory, fix the score carry over and carry over lives aswell

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 38:3a077f0259df 122 lcd.printString(" RESTART? ",2,2);
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