FINAL VERSION

Dependencies:   mbed

Committer:
jamesheavey
Date:
Mon Apr 22 21:45:18 2019 +0000
Revision:
12:f714a9e8c55b
Parent:
10:9f445faa892c
Child:
13:418a71b24b37
hardcoded all the brick collisions need to fix slightly, need to add side collisions maybe (invert x velocity) need to add victory screen, tilt option, figure out how to not hardcode the bricks

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 0:7d4d2023ed9c 5 #include "PongEngine.h"
jamesheavey 3:5719d0fe94ed 6 #include "Bitmap.h"
jamesheavey 4:6bd488b5b31a 7 #include<iostream>
jamesheavey 8:1ab6d90c4d60 8 #include "Sprites.h"
jamesheavey 0:7d4d2023ed9c 9
jamesheavey 0:7d4d2023ed9c 10 #ifdef WITH_TESTING
jamesheavey 0:7d4d2023ed9c 11 # include "tests.h"
jamesheavey 0:7d4d2023ed9c 12 #endif
jamesheavey 0:7d4d2023ed9c 13
jamesheavey 9:f6f0f39538c7 14 #define PADDLE_WIDTH 15
jamesheavey 0:7d4d2023ed9c 15 #define PADDLE_HEIGHT 2
jamesheavey 0:7d4d2023ed9c 16 #define BALL_SIZE 2
jamesheavey 0:7d4d2023ed9c 17 #define BALL_SPEED 3
jamesheavey 0:7d4d2023ed9c 18
jamesheavey 0:7d4d2023ed9c 19 /////////////// structs /////////////////
jamesheavey 0:7d4d2023ed9c 20 struct UserInput {
jamesheavey 0:7d4d2023ed9c 21 Direction d;
jamesheavey 0:7d4d2023ed9c 22 float mag;
jamesheavey 0:7d4d2023ed9c 23 };
jamesheavey 0:7d4d2023ed9c 24 /////////////// objects ///////////////
jamesheavey 0:7d4d2023ed9c 25 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
jamesheavey 0:7d4d2023ed9c 26 Gamepad pad;
jamesheavey 0:7d4d2023ed9c 27 PongEngine pong;
jamesheavey 0:7d4d2023ed9c 28
jamesheavey 0:7d4d2023ed9c 29 ///////////// prototypes ///////////////
jamesheavey 0:7d4d2023ed9c 30 void init();
jamesheavey 0:7d4d2023ed9c 31 void update_game(UserInput input);
jamesheavey 0:7d4d2023ed9c 32 void render();
jamesheavey 0:7d4d2023ed9c 33 void welcome();
jamesheavey 10:9f445faa892c 34 void end_screen();
jamesheavey 10:9f445faa892c 35 void main_menu();
jamesheavey 0:7d4d2023ed9c 36
jamesheavey 0:7d4d2023ed9c 37 ///////////// functions ////////////////
jamesheavey 0:7d4d2023ed9c 38 int main()
jamesheavey 0:7d4d2023ed9c 39 {
jamesheavey 0:7d4d2023ed9c 40 #ifdef WITH_TESTING
jamesheavey 0:7d4d2023ed9c 41 int number_of_failures = run_all_tests();
jamesheavey 0:7d4d2023ed9c 42
jamesheavey 0:7d4d2023ed9c 43 if(number_of_failures > 0) return number_of_failures;
jamesheavey 0:7d4d2023ed9c 44 #endif
jamesheavey 10:9f445faa892c 45 main_menu();
jamesheavey 3:5719d0fe94ed 46
jamesheavey 0:7d4d2023ed9c 47 }
jamesheavey 0:7d4d2023ed9c 48
jamesheavey 0:7d4d2023ed9c 49 // initialies all classes and libraries
jamesheavey 0:7d4d2023ed9c 50 void init()
jamesheavey 0:7d4d2023ed9c 51 {
jamesheavey 0:7d4d2023ed9c 52 // need to initialise LCD and Gamepad
jamesheavey 0:7d4d2023ed9c 53 lcd.init();
jamesheavey 0:7d4d2023ed9c 54 pad.init();
jamesheavey 0:7d4d2023ed9c 55
jamesheavey 0:7d4d2023ed9c 56 // initialise the game with correct ball and paddle sizes
jamesheavey 0:7d4d2023ed9c 57 pong.init(PADDLE_WIDTH,PADDLE_HEIGHT,BALL_SIZE,BALL_SPEED);
jamesheavey 0:7d4d2023ed9c 58
jamesheavey 0:7d4d2023ed9c 59 }
jamesheavey 0:7d4d2023ed9c 60
jamesheavey 0:7d4d2023ed9c 61 // this function draws each frame on the LCD
jamesheavey 0:7d4d2023ed9c 62 void render()
jamesheavey 0:7d4d2023ed9c 63 {
jamesheavey 0:7d4d2023ed9c 64 // clear screen, re-draw and refresh
jamesheavey 0:7d4d2023ed9c 65 lcd.clear();
jamesheavey 0:7d4d2023ed9c 66 pong.draw(lcd);
jamesheavey 0:7d4d2023ed9c 67 lcd.refresh();
jamesheavey 0:7d4d2023ed9c 68 }
jamesheavey 0:7d4d2023ed9c 69
jamesheavey 0:7d4d2023ed9c 70 // simple splash screen displayed on start-up
jamesheavey 0:7d4d2023ed9c 71 void welcome() {
jamesheavey 3:5719d0fe94ed 72 Bitmap breakwhite(breakwhite_data, 48, 84);
jamesheavey 3:5719d0fe94ed 73 Bitmap breakblack(breakblack_data, 48, 84);
jamesheavey 0:7d4d2023ed9c 74
jamesheavey 0:7d4d2023ed9c 75 // wait flashing LEDs until start button is pressed
jamesheavey 9:f6f0f39538c7 76 while (pad.check_event(Gamepad::START_PRESSED) == false) {
jamesheavey 3:5719d0fe94ed 77 lcd.clear();
jamesheavey 3:5719d0fe94ed 78
jamesheavey 3:5719d0fe94ed 79 breakwhite.render(lcd, 0, 0);
jamesheavey 3:5719d0fe94ed 80 lcd.printString(" PRESS START ",2,5);
jamesheavey 3:5719d0fe94ed 81 lcd.refresh();
jamesheavey 0:7d4d2023ed9c 82 pad.leds_on();
jamesheavey 3:5719d0fe94ed 83 wait(0.5);
jamesheavey 3:5719d0fe94ed 84
jamesheavey 3:5719d0fe94ed 85 lcd.clear();
jamesheavey 3:5719d0fe94ed 86
jamesheavey 3:5719d0fe94ed 87 breakblack.render(lcd, 0, 0);
jamesheavey 3:5719d0fe94ed 88 lcd.printString(" PRESS START ",2,5);
jamesheavey 3:5719d0fe94ed 89 lcd.refresh();
jamesheavey 0:7d4d2023ed9c 90 pad.leds_off();
jamesheavey 3:5719d0fe94ed 91 wait(0.5);
jamesheavey 3:5719d0fe94ed 92
jamesheavey 0:7d4d2023ed9c 93 }
jamesheavey 0:7d4d2023ed9c 94
jamesheavey 10:9f445faa892c 95 }
jamesheavey 10:9f445faa892c 96
jamesheavey 10:9f445faa892c 97 void end_screen() {
jamesheavey 10:9f445faa892c 98
jamesheavey 10:9f445faa892c 99 while (pad.check_event(Gamepad::START_PRESSED) == false) {
jamesheavey 10:9f445faa892c 100 lcd.clear();
jamesheavey 10:9f445faa892c 101 lcd.printString(" RESTART? ",2,2);
jamesheavey 10:9f445faa892c 102 lcd.printString(" PRESS START ",1,4);
jamesheavey 10:9f445faa892c 103 lcd.refresh();
jamesheavey 10:9f445faa892c 104 // if (pad.check_event(Gamepad::START_PRESSED == true) {
jamesheavey 10:9f445faa892c 105 // return true;
jamesheavey 10:9f445faa892c 106 // }
jamesheavey 10:9f445faa892c 107 // else if (pad.check_event(Gamepad::BACK_PRESSED == true) {
jamesheavey 10:9f445faa892c 108 // return false;
jamesheavey 10:9f445faa892c 109 // }
jamesheavey 10:9f445faa892c 110
jamesheavey 10:9f445faa892c 111 }
jamesheavey 10:9f445faa892c 112 main_menu();
jamesheavey 10:9f445faa892c 113 }
jamesheavey 10:9f445faa892c 114
jamesheavey 10:9f445faa892c 115 void main_menu() {
jamesheavey 10:9f445faa892c 116 int fps = 8; // frames per second
jamesheavey 10:9f445faa892c 117 bool pause = false;
jamesheavey 10:9f445faa892c 118 init(); // initialise and then display welcome screen...
jamesheavey 10:9f445faa892c 119 welcome(); // waiting for the user to start
jamesheavey 10:9f445faa892c 120
jamesheavey 10:9f445faa892c 121 Bitmap three(three_data, 48, 84);
jamesheavey 10:9f445faa892c 122 Bitmap two(two_data, 48, 84);
jamesheavey 10:9f445faa892c 123 Bitmap one(one_data, 48, 84);
jamesheavey 10:9f445faa892c 124
jamesheavey 10:9f445faa892c 125 lcd.clear();
jamesheavey 10:9f445faa892c 126 three.render(lcd, 0, 0);
jamesheavey 10:9f445faa892c 127 lcd.refresh();
jamesheavey 10:9f445faa892c 128 wait(1);
jamesheavey 10:9f445faa892c 129
jamesheavey 10:9f445faa892c 130 lcd.clear();
jamesheavey 10:9f445faa892c 131 two.render(lcd, 0, 0);
jamesheavey 10:9f445faa892c 132 lcd.refresh();
jamesheavey 10:9f445faa892c 133 wait(1);
jamesheavey 10:9f445faa892c 134
jamesheavey 10:9f445faa892c 135 lcd.clear();
jamesheavey 10:9f445faa892c 136 one.render(lcd, 0, 0);
jamesheavey 10:9f445faa892c 137 lcd.refresh();
jamesheavey 10:9f445faa892c 138 wait(1);
jamesheavey 10:9f445faa892c 139
jamesheavey 10:9f445faa892c 140 render(); // first draw the initial frame
jamesheavey 10:9f445faa892c 141 wait(1.0f/fps); // and wait for one frame period
jamesheavey 10:9f445faa892c 142
jamesheavey 10:9f445faa892c 143
jamesheavey 10:9f445faa892c 144 // game loop - read input, update the game state and render the display
jamesheavey 10:9f445faa892c 145 while (1) {
jamesheavey 10:9f445faa892c 146 pong.read_input(pad);
jamesheavey 10:9f445faa892c 147 pong.update(pad);
jamesheavey 10:9f445faa892c 148 render();
jamesheavey 12:f714a9e8c55b 149 if (pong.check_goal(pad) == true) {
jamesheavey 12:f714a9e8c55b 150 lcd.setBrightness(0);
jamesheavey 12:f714a9e8c55b 151 wait(0.1);
jamesheavey 12:f714a9e8c55b 152 lcd.setBrightness(1);
jamesheavey 12:f714a9e8c55b 153 wait(0.1);
jamesheavey 12:f714a9e8c55b 154 lcd.setBrightness(0);
jamesheavey 12:f714a9e8c55b 155 wait(0.1);
jamesheavey 12:f714a9e8c55b 156 lcd.setBrightness(1);
jamesheavey 12:f714a9e8c55b 157 wait(0.1);
jamesheavey 12:f714a9e8c55b 158 lcd.setBrightness(0);
jamesheavey 12:f714a9e8c55b 159 wait(0.1);
jamesheavey 12:f714a9e8c55b 160 lcd.setBrightness(1);
jamesheavey 12:f714a9e8c55b 161 wait(0.1);
jamesheavey 12:f714a9e8c55b 162 lcd.setBrightness(0);
jamesheavey 12:f714a9e8c55b 163 wait(0.1);
jamesheavey 12:f714a9e8c55b 164 lcd.setBrightness(1);
jamesheavey 12:f714a9e8c55b 165 }
jamesheavey 10:9f445faa892c 166 if (pad.check_event(Gamepad::BACK_PRESSED) == true) {
jamesheavey 10:9f445faa892c 167 pause = !pause;
jamesheavey 10:9f445faa892c 168 }
jamesheavey 10:9f445faa892c 169 while (pause == true) {
jamesheavey 10:9f445faa892c 170 lcd.clear();
jamesheavey 10:9f445faa892c 171 lcd.printString(" PAUSED ",0,2);
jamesheavey 10:9f445faa892c 172 lcd.refresh();
jamesheavey 10:9f445faa892c 173 if (pad.check_event(Gamepad::BACK_PRESSED) == true) {
jamesheavey 10:9f445faa892c 174 pause = !pause;
jamesheavey 10:9f445faa892c 175 }
jamesheavey 10:9f445faa892c 176 wait(1.0f/fps);
jamesheavey 10:9f445faa892c 177 }
jamesheavey 10:9f445faa892c 178 if (pong.get_lives() == 0) {
jamesheavey 10:9f445faa892c 179 //if (end_screen() == true) {
jamesheavey 10:9f445faa892c 180 // main_menu();
jamesheavey 10:9f445faa892c 181 //}
jamesheavey 10:9f445faa892c 182 //else {
jamesheavey 10:9f445faa892c 183 // main_menu();
jamesheavey 10:9f445faa892c 184 //}
jamesheavey 10:9f445faa892c 185 end_screen();
jamesheavey 10:9f445faa892c 186 }
jamesheavey 10:9f445faa892c 187 wait(1.0f/fps);
jamesheavey 10:9f445faa892c 188 }
jamesheavey 10:9f445faa892c 189 }
jamesheavey 10:9f445faa892c 190