FINAL VERSION

Dependencies:   mbed

Committer:
jamesheavey
Date:
Thu Apr 25 21:05:18 2019 +0000
Revision:
38:3a077f0259df
Parent:
27:1b5038b0a7a2
Child:
43:81d22f68dfae

        

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 0:7d4d2023ed9c 37
jamesheavey 0:7d4d2023ed9c 38 ///////////// functions ////////////////
jamesheavey 0:7d4d2023ed9c 39 int main()
jamesheavey 0:7d4d2023ed9c 40 {
jamesheavey 0:7d4d2023ed9c 41 #ifdef WITH_TESTING
jamesheavey 0:7d4d2023ed9c 42 int number_of_failures = run_all_tests();
jamesheavey 0:7d4d2023ed9c 43
jamesheavey 0:7d4d2023ed9c 44 if(number_of_failures > 0) return number_of_failures;
jamesheavey 0:7d4d2023ed9c 45 #endif
jamesheavey 10:9f445faa892c 46 main_menu();
jamesheavey 3:5719d0fe94ed 47
jamesheavey 0:7d4d2023ed9c 48 }
jamesheavey 0:7d4d2023ed9c 49
jamesheavey 0:7d4d2023ed9c 50 // initialies all classes and libraries
jamesheavey 0:7d4d2023ed9c 51 void init()
jamesheavey 0:7d4d2023ed9c 52 {
jamesheavey 0:7d4d2023ed9c 53 // need to initialise LCD and Gamepad
jamesheavey 0:7d4d2023ed9c 54 lcd.init();
jamesheavey 0:7d4d2023ed9c 55 pad.init();
jamesheavey 0:7d4d2023ed9c 56
jamesheavey 0:7d4d2023ed9c 57 // initialise the game with correct ball and paddle sizes
jamesheavey 26:25eea19c5fbe 58 breakout.init(PADDLE_WIDTH,PADDLE_HEIGHT,BALL_SIZE,pad.read_pot()*3+2);
jamesheavey 0:7d4d2023ed9c 59
jamesheavey 0:7d4d2023ed9c 60 }
jamesheavey 0:7d4d2023ed9c 61
jamesheavey 0:7d4d2023ed9c 62 // this function draws each frame on the LCD
jamesheavey 0:7d4d2023ed9c 63 void render()
jamesheavey 0:7d4d2023ed9c 64 {
jamesheavey 0:7d4d2023ed9c 65 // clear screen, re-draw and refresh
jamesheavey 0:7d4d2023ed9c 66 lcd.clear();
jamesheavey 26:25eea19c5fbe 67 breakout.draw(lcd);
jamesheavey 0:7d4d2023ed9c 68 lcd.refresh();
jamesheavey 0:7d4d2023ed9c 69 }
jamesheavey 0:7d4d2023ed9c 70
jamesheavey 0:7d4d2023ed9c 71 // simple splash screen displayed on start-up
jamesheavey 16:1761dfe801af 72 bool welcome() {
jamesheavey 3:5719d0fe94ed 73 Bitmap breakwhite(breakwhite_data, 48, 84);
jamesheavey 3:5719d0fe94ed 74 Bitmap breakblack(breakblack_data, 48, 84);
jamesheavey 0:7d4d2023ed9c 75
jamesheavey 0:7d4d2023ed9c 76 // wait flashing LEDs until start button is pressed
jamesheavey 14:38560375d420 77 //bool joy = true;
jamesheavey 14:38560375d420 78
jamesheavey 22:fa2e0b58043a 79 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 80
jamesheavey 3:5719d0fe94ed 81 breakwhite.render(lcd, 0, 0);
jamesheavey 3:5719d0fe94ed 82 lcd.refresh();
jamesheavey 0:7d4d2023ed9c 83 pad.leds_on();
jamesheavey 3:5719d0fe94ed 84 wait(0.5);
jamesheavey 14:38560375d420 85
jamesheavey 3:5719d0fe94ed 86 lcd.clear();
jamesheavey 14:38560375d420 87
jamesheavey 3:5719d0fe94ed 88 breakblack.render(lcd, 0, 0);
jamesheavey 3:5719d0fe94ed 89 lcd.refresh();
jamesheavey 0:7d4d2023ed9c 90 pad.leds_off();
jamesheavey 3:5719d0fe94ed 91 wait(0.5);
jamesheavey 16:1761dfe801af 92
jamesheavey 22:fa2e0b58043a 93 if (pad.check_event(Gamepad::L_PRESSED) || pad.check_event(Gamepad::BACK_PRESSED)) {
jamesheavey 16:1761dfe801af 94 return false;
jamesheavey 16:1761dfe801af 95 }
jamesheavey 22:fa2e0b58043a 96 if (pad.check_event(Gamepad::R_PRESSED) || pad.check_event(Gamepad::START_PRESSED)) {
jamesheavey 16:1761dfe801af 97 return true;
jamesheavey 16:1761dfe801af 98 }
jamesheavey 0:7d4d2023ed9c 99 }
jamesheavey 16:1761dfe801af 100 return false;
jamesheavey 10:9f445faa892c 101 }
jamesheavey 10:9f445faa892c 102
jamesheavey 16:1761dfe801af 103
jamesheavey 10:9f445faa892c 104 void end_screen() {
jamesheavey 15:b867a6620f96 105 lcd.clear();
jamesheavey 38:3a077f0259df 106 lcd.printString(" RESTART? ",2,2);
jamesheavey 15:b867a6620f96 107 lcd.printString(" PRESS START ",1,4);
jamesheavey 15:b867a6620f96 108 lcd.refresh();
jamesheavey 15:b867a6620f96 109 pad.tone(750.0,0.3);
jamesheavey 15:b867a6620f96 110 wait(0.4);
jamesheavey 15:b867a6620f96 111
jamesheavey 15:b867a6620f96 112 pad.tone(300.0,0.3);
jamesheavey 15:b867a6620f96 113 wait(0.4);
jamesheavey 10:9f445faa892c 114
jamesheavey 10:9f445faa892c 115 while (pad.check_event(Gamepad::START_PRESSED) == false) {
jamesheavey 10:9f445faa892c 116 lcd.clear();
jamesheavey 38:3a077f0259df 117 lcd.printString(" RESTART? ",2,2);
jamesheavey 10:9f445faa892c 118 lcd.printString(" PRESS START ",1,4);
jamesheavey 10:9f445faa892c 119 lcd.refresh();
jamesheavey 10:9f445faa892c 120 // if (pad.check_event(Gamepad::START_PRESSED == true) {
jamesheavey 10:9f445faa892c 121 // return true;
jamesheavey 10:9f445faa892c 122 // }
jamesheavey 10:9f445faa892c 123 // else if (pad.check_event(Gamepad::BACK_PRESSED == true) {
jamesheavey 10:9f445faa892c 124 // return false;
jamesheavey 10:9f445faa892c 125 // }
jamesheavey 10:9f445faa892c 126
jamesheavey 10:9f445faa892c 127 }
jamesheavey 10:9f445faa892c 128 main_menu();
jamesheavey 10:9f445faa892c 129 }
jamesheavey 10:9f445faa892c 130
jamesheavey 13:418a71b24b37 131 void victory_screen() {
jamesheavey 15:b867a6620f96 132 lcd.clear();
jamesheavey 22:fa2e0b58043a 133 lcd.printString(" VICTORY! ",2,2);
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 13:418a71b24b37 143 while (pad.check_event(Gamepad::START_PRESSED) == false) {
jamesheavey 13:418a71b24b37 144 lcd.clear();
jamesheavey 22:fa2e0b58043a 145 lcd.printString(" VICTORY! ",2,2);
jamesheavey 13:418a71b24b37 146 lcd.refresh();
jamesheavey 15:b867a6620f96 147
jamesheavey 15:b867a6620f96 148
jamesheavey 15:b867a6620f96 149
jamesheavey 13:418a71b24b37 150 // if (pad.check_event(Gamepad::START_PRESSED == true) {
jamesheavey 13:418a71b24b37 151 // return true;
jamesheavey 13:418a71b24b37 152 // }
jamesheavey 13:418a71b24b37 153 // else if (pad.check_event(Gamepad::BACK_PRESSED == true) {
jamesheavey 13:418a71b24b37 154 // return false;
jamesheavey 13:418a71b24b37 155 // }
jamesheavey 13:418a71b24b37 156
jamesheavey 13:418a71b24b37 157 }
jamesheavey 13:418a71b24b37 158 main_menu();
jamesheavey 13:418a71b24b37 159 }
jamesheavey 13:418a71b24b37 160
jamesheavey 10:9f445faa892c 161 void main_menu() {
jamesheavey 10:9f445faa892c 162 int fps = 8; // frames per second
jamesheavey 10:9f445faa892c 163 bool pause = false;
jamesheavey 16:1761dfe801af 164 bool tilt = false;
jamesheavey 10:9f445faa892c 165 init(); // 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 10:9f445faa892c 170 Bitmap three(three_data, 48, 84);
jamesheavey 10:9f445faa892c 171 Bitmap two(two_data, 48, 84);
jamesheavey 10:9f445faa892c 172 Bitmap one(one_data, 48, 84);
jamesheavey 10:9f445faa892c 173
jamesheavey 10:9f445faa892c 174 lcd.clear();
jamesheavey 10:9f445faa892c 175 three.render(lcd, 0, 0);
jamesheavey 10:9f445faa892c 176 lcd.refresh();
jamesheavey 15:b867a6620f96 177 pad.tone(500.0,0.5);
jamesheavey 10:9f445faa892c 178 wait(1);
jamesheavey 10:9f445faa892c 179
jamesheavey 10:9f445faa892c 180 lcd.clear();
jamesheavey 10:9f445faa892c 181 two.render(lcd, 0, 0);
jamesheavey 10:9f445faa892c 182 lcd.refresh();
jamesheavey 15:b867a6620f96 183 pad.tone(500.0,0.5);
jamesheavey 10:9f445faa892c 184 wait(1);
jamesheavey 10:9f445faa892c 185
jamesheavey 10:9f445faa892c 186 lcd.clear();
jamesheavey 10:9f445faa892c 187 one.render(lcd, 0, 0);
jamesheavey 10:9f445faa892c 188 lcd.refresh();
jamesheavey 15:b867a6620f96 189 pad.tone(1000.0,1);
jamesheavey 10:9f445faa892c 190 wait(1);
jamesheavey 10:9f445faa892c 191
jamesheavey 10:9f445faa892c 192 render(); // first draw the initial frame
jamesheavey 10:9f445faa892c 193 wait(1.0f/fps); // and wait for one frame period
jamesheavey 10:9f445faa892c 194
jamesheavey 10:9f445faa892c 195
jamesheavey 10:9f445faa892c 196 // game loop - read input, update the game state and render the display
jamesheavey 10:9f445faa892c 197 while (1) {
jamesheavey 26:25eea19c5fbe 198 breakout.read_input(pad,tilt);
jamesheavey 26:25eea19c5fbe 199 breakout.update(pad);
jamesheavey 10:9f445faa892c 200 render();
jamesheavey 26:25eea19c5fbe 201 if (breakout.check_goal(pad) == true) {
jamesheavey 12:f714a9e8c55b 202 lcd.setBrightness(0);
jamesheavey 12:f714a9e8c55b 203 wait(0.1);
jamesheavey 12:f714a9e8c55b 204 lcd.setBrightness(1);
jamesheavey 12:f714a9e8c55b 205 wait(0.1);
jamesheavey 12:f714a9e8c55b 206 lcd.setBrightness(0);
jamesheavey 12:f714a9e8c55b 207 wait(0.1);
jamesheavey 12:f714a9e8c55b 208 lcd.setBrightness(1);
jamesheavey 12:f714a9e8c55b 209 wait(0.1);
jamesheavey 12:f714a9e8c55b 210 lcd.setBrightness(0);
jamesheavey 12:f714a9e8c55b 211 wait(0.1);
jamesheavey 12:f714a9e8c55b 212 lcd.setBrightness(1);
jamesheavey 12:f714a9e8c55b 213 wait(0.1);
jamesheavey 12:f714a9e8c55b 214 lcd.setBrightness(0);
jamesheavey 12:f714a9e8c55b 215 wait(0.1);
jamesheavey 12:f714a9e8c55b 216 lcd.setBrightness(1);
jamesheavey 12:f714a9e8c55b 217 }
jamesheavey 10:9f445faa892c 218 if (pad.check_event(Gamepad::BACK_PRESSED) == true) {
jamesheavey 10:9f445faa892c 219 pause = !pause;
jamesheavey 10:9f445faa892c 220 }
jamesheavey 10:9f445faa892c 221 while (pause == true) {
jamesheavey 10:9f445faa892c 222 lcd.clear();
jamesheavey 10:9f445faa892c 223 lcd.printString(" PAUSED ",0,2);
jamesheavey 10:9f445faa892c 224 lcd.refresh();
jamesheavey 10:9f445faa892c 225 if (pad.check_event(Gamepad::BACK_PRESSED) == true) {
jamesheavey 10:9f445faa892c 226 pause = !pause;
jamesheavey 10:9f445faa892c 227 }
jamesheavey 10:9f445faa892c 228 wait(1.0f/fps);
jamesheavey 10:9f445faa892c 229 }
jamesheavey 26:25eea19c5fbe 230 if (breakout.get_lives() == 0) {
jamesheavey 10:9f445faa892c 231 //if (end_screen() == true) {
jamesheavey 10:9f445faa892c 232 // main_menu();
jamesheavey 10:9f445faa892c 233 //}
jamesheavey 10:9f445faa892c 234 //else {
jamesheavey 10:9f445faa892c 235 // main_menu();
jamesheavey 10:9f445faa892c 236 //}
jamesheavey 14:38560375d420 237 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 238 end_screen();
jamesheavey 10:9f445faa892c 239 }
jamesheavey 26:25eea19c5fbe 240 if (breakout.get_num_left() == 0) {
jamesheavey 13:418a71b24b37 241 victory_screen();
jamesheavey 13:418a71b24b37 242 }
jamesheavey 10:9f445faa892c 243 wait(1.0f/fps);
jamesheavey 10:9f445faa892c 244 }
jamesheavey 10:9f445faa892c 245 }
jamesheavey 10:9f445faa892c 246