James Heavey / Mbed 2 deprecated EL17JH

Dependencies:   mbed

Committer:
jamesheavey
Date:
Fri Apr 26 21:57:09 2019 +0000
Revision:
48:966f2cf803ec
Parent:
47:1d1a827be81b
Child:
57:d498dd835cfc
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 27:1b5038b0a7a2 1 #include "BreakoutEngine.h"
jamesheavey 27:1b5038b0a7a2 2
jamesheavey 27:1b5038b0a7a2 3
jamesheavey 27:1b5038b0a7a2 4
jamesheavey 27:1b5038b0a7a2 5 BreakoutEngine::BreakoutEngine()
jamesheavey 27:1b5038b0a7a2 6 {
jamesheavey 27:1b5038b0a7a2 7
jamesheavey 27:1b5038b0a7a2 8 }
jamesheavey 27:1b5038b0a7a2 9
jamesheavey 27:1b5038b0a7a2 10 BreakoutEngine::~BreakoutEngine()
jamesheavey 27:1b5038b0a7a2 11 {
jamesheavey 27:1b5038b0a7a2 12
jamesheavey 27:1b5038b0a7a2 13 }
jamesheavey 27:1b5038b0a7a2 14
jamesheavey 47:1d1a827be81b 15 void BreakoutEngine::init(int paddle_width,int paddle_height,int ball_size,int speed, int prev_score)
jamesheavey 27:1b5038b0a7a2 16 {
jamesheavey 27:1b5038b0a7a2 17 // initialise the game parameters
jamesheavey 27:1b5038b0a7a2 18 _paddle_width = paddle_width;
jamesheavey 27:1b5038b0a7a2 19 _paddle_height = paddle_height;
jamesheavey 27:1b5038b0a7a2 20 _ball_size = ball_size;
jamesheavey 27:1b5038b0a7a2 21 _speed = speed;
jamesheavey 27:1b5038b0a7a2 22 _number_left = 18;
jamesheavey 30:e3d2f0ca416f 23 _index = 0;
jamesheavey 45:b1ac80481d4f 24 _cool_time = 0.0f;
jamesheavey 47:1d1a827be81b 25 _prev_score = prev_score;
jamesheavey 47:1d1a827be81b 26
jamesheavey 27:1b5038b0a7a2 27 // y position on screen - WIDTH is defined in N5110.h
jamesheavey 40:ac53905346fb 28 _p1y = HEIGHT - GAP - 1;
jamesheavey 27:1b5038b0a7a2 29
jamesheavey 27:1b5038b0a7a2 30 // puts paddles and ball in middle
jamesheavey 27:1b5038b0a7a2 31 _p1.init(_p1y,_paddle_height,_paddle_width);
jamesheavey 27:1b5038b0a7a2 32 _ball.init(_ball_size,_speed);
jamesheavey 27:1b5038b0a7a2 33
jamesheavey 40:ac53905346fb 34 _brick11.init(3,GAP_TOP+1,BRICK_HEIGHT,BRICK_WIDTH); // need to figure out how to make a list of these
jamesheavey 40:ac53905346fb 35 _brick12.init(16,GAP_TOP+1,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 36 _brick13.init(29,GAP_TOP+1,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 37 _brick14.init(42,GAP_TOP+1,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 38 _brick15.init(55,GAP_TOP+1,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 39 _brick16.init(68,GAP_TOP+1,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 27:1b5038b0a7a2 40
jamesheavey 40:ac53905346fb 41 _brick21.init(3,GAP_TOP+BRICK_HEIGHT+2,BRICK_HEIGHT,BRICK_WIDTH); // need to figure out how to make a list of these
jamesheavey 40:ac53905346fb 42 _brick22.init(16,GAP_TOP+BRICK_HEIGHT+2,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 43 _brick23.init(29,GAP_TOP+BRICK_HEIGHT+2,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 44 _brick24.init(42,GAP_TOP+BRICK_HEIGHT+2,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 45 _brick25.init(55,GAP_TOP+BRICK_HEIGHT+2,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 46 _brick26.init(68,GAP_TOP+BRICK_HEIGHT+2,BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 27:1b5038b0a7a2 47
jamesheavey 40:ac53905346fb 48 _brick31.init(3,GAP_TOP+1+((BRICK_HEIGHT+1)*2),BRICK_HEIGHT,BRICK_WIDTH); // need to figure out how to make a list of these
jamesheavey 40:ac53905346fb 49 _brick32.init(16,GAP_TOP+1+((BRICK_HEIGHT+1)*2),BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 50 _brick33.init(29,GAP_TOP+1+((BRICK_HEIGHT+1)*2),BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 51 _brick34.init(42,GAP_TOP+1+((BRICK_HEIGHT+1)*2),BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 52 _brick35.init(55,GAP_TOP+1+((BRICK_HEIGHT+1)*2),BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 40:ac53905346fb 53 _brick36.init(68,GAP_TOP+1+((BRICK_HEIGHT+1)*2),BRICK_HEIGHT,BRICK_WIDTH);
jamesheavey 27:1b5038b0a7a2 54
jamesheavey 34:07ded1f83c59 55 listofBricks.push_back(_brick11); //maybe be able yo iterate through and this.draw(), maybe useful if i figure out how to delete objects aswell
jamesheavey 34:07ded1f83c59 56 listofBricks.push_back(_brick12);
jamesheavey 34:07ded1f83c59 57 listofBricks.push_back(_brick13);
jamesheavey 34:07ded1f83c59 58 listofBricks.push_back(_brick14);
jamesheavey 34:07ded1f83c59 59 listofBricks.push_back(_brick15);
jamesheavey 34:07ded1f83c59 60 listofBricks.push_back(_brick16);
jamesheavey 34:07ded1f83c59 61 listofBricks.push_back(_brick21);
jamesheavey 34:07ded1f83c59 62 listofBricks.push_back(_brick22);
jamesheavey 34:07ded1f83c59 63 listofBricks.push_back(_brick23);
jamesheavey 34:07ded1f83c59 64 listofBricks.push_back(_brick24);
jamesheavey 34:07ded1f83c59 65 listofBricks.push_back(_brick25);
jamesheavey 34:07ded1f83c59 66 listofBricks.push_back(_brick26);
jamesheavey 34:07ded1f83c59 67 listofBricks.push_back(_brick31);
jamesheavey 34:07ded1f83c59 68 listofBricks.push_back(_brick32);
jamesheavey 34:07ded1f83c59 69 listofBricks.push_back(_brick33);
jamesheavey 34:07ded1f83c59 70 listofBricks.push_back(_brick34);
jamesheavey 34:07ded1f83c59 71 listofBricks.push_back(_brick35);
jamesheavey 34:07ded1f83c59 72 listofBricks.push_back(_brick36);
jamesheavey 34:07ded1f83c59 73
jamesheavey 30:e3d2f0ca416f 74 _laser1.init(-10);
jamesheavey 30:e3d2f0ca416f 75 _laser2.init(-10);
jamesheavey 30:e3d2f0ca416f 76 _laser3.init(-10);
jamesheavey 35:3a614d539a54 77
jamesheavey 35:3a614d539a54 78 listofLasers.push_back(_laser1);
jamesheavey 35:3a614d539a54 79 listofLasers.push_back(_laser2);
jamesheavey 35:3a614d539a54 80 listofLasers.push_back(_laser3);
jamesheavey 27:1b5038b0a7a2 81 }
jamesheavey 27:1b5038b0a7a2 82
jamesheavey 27:1b5038b0a7a2 83 void BreakoutEngine::read_input(Gamepad &pad, bool x)
jamesheavey 27:1b5038b0a7a2 84 {
jamesheavey 27:1b5038b0a7a2 85 _d = pad.get_direction();
jamesheavey 27:1b5038b0a7a2 86 _mag = pad.get_mag();
jamesheavey 27:1b5038b0a7a2 87
jamesheavey 27:1b5038b0a7a2 88 if (x == true) {
jamesheavey 27:1b5038b0a7a2 89 _p1.set_tilt();
jamesheavey 27:1b5038b0a7a2 90 }
jamesheavey 27:1b5038b0a7a2 91 else {
jamesheavey 27:1b5038b0a7a2 92 _p1.set_joy();
jamesheavey 27:1b5038b0a7a2 93 }
jamesheavey 45:b1ac80481d4f 94
jamesheavey 45:b1ac80481d4f 95 if (pad.check_event(Gamepad::B_PRESSED) && _cool_time <= 0) { // max of 3 lasers on screen at once
jamesheavey 29:5168318d3e88 96
jamesheavey 29:5168318d3e88 97 Vector2D p_pos = _p1.get_pos();
jamesheavey 37:dd1538ae6534 98 it_L = listofLasers.begin();
jamesheavey 30:e3d2f0ca416f 99 switch(_index){
jamesheavey 30:e3d2f0ca416f 100 case 0:
jamesheavey 37:dd1538ae6534 101 advance(it_L, 0);
jamesheavey 37:dd1538ae6534 102 it_L -> set_posx(p_pos.x+7);
jamesheavey 37:dd1538ae6534 103 it_L -> set_posy(p_pos.y);
jamesheavey 30:e3d2f0ca416f 104 inc_index();
jamesheavey 30:e3d2f0ca416f 105 break;
jamesheavey 30:e3d2f0ca416f 106 case 1:
jamesheavey 37:dd1538ae6534 107 advance(it_L, 1);
jamesheavey 37:dd1538ae6534 108 it_L -> set_posx(p_pos.x+7);
jamesheavey 37:dd1538ae6534 109 it_L -> set_posy(p_pos.y);
jamesheavey 30:e3d2f0ca416f 110 inc_index();
jamesheavey 30:e3d2f0ca416f 111 break;
jamesheavey 30:e3d2f0ca416f 112 case 2:
jamesheavey 37:dd1538ae6534 113 advance(it_L, 2);
jamesheavey 37:dd1538ae6534 114 it_L -> set_posx(p_pos.x+7);
jamesheavey 37:dd1538ae6534 115 it_L -> set_posy(p_pos.y);
jamesheavey 30:e3d2f0ca416f 116 reset_index();
jamesheavey 30:e3d2f0ca416f 117 break;
jamesheavey 30:e3d2f0ca416f 118 }
jamesheavey 45:b1ac80481d4f 119
jamesheavey 45:b1ac80481d4f 120
jamesheavey 46:810b3a7fc387 121 _cool_time = 0.75f;
jamesheavey 29:5168318d3e88 122 }
jamesheavey 45:b1ac80481d4f 123 else {
jamesheavey 45:b1ac80481d4f 124 _cool_time -= 0.125; // 1/8 as fps is 8
jamesheavey 45:b1ac80481d4f 125 }
jamesheavey 45:b1ac80481d4f 126
jamesheavey 27:1b5038b0a7a2 127 }
jamesheavey 27:1b5038b0a7a2 128
jamesheavey 30:e3d2f0ca416f 129 void BreakoutEngine::inc_index() {
jamesheavey 30:e3d2f0ca416f 130 _index ++;
jamesheavey 30:e3d2f0ca416f 131 }
jamesheavey 30:e3d2f0ca416f 132
jamesheavey 30:e3d2f0ca416f 133 void BreakoutEngine::reset_index() {
jamesheavey 30:e3d2f0ca416f 134 _index = 0;
jamesheavey 30:e3d2f0ca416f 135 }
jamesheavey 30:e3d2f0ca416f 136
jamesheavey 27:1b5038b0a7a2 137 void BreakoutEngine::draw(N5110 &lcd)
jamesheavey 27:1b5038b0a7a2 138 {
jamesheavey 27:1b5038b0a7a2 139 // draw the elements in the LCD buffer
jamesheavey 27:1b5038b0a7a2 140 // pitch
jamesheavey 40:ac53905346fb 141 lcd.drawRect(0,GAP_TOP - 2,WIDTH,HEIGHT - GAP_TOP + 2,FILL_TRANSPARENT);
jamesheavey 27:1b5038b0a7a2 142 //score
jamesheavey 40:ac53905346fb 143 print_scores(lcd);
jamesheavey 27:1b5038b0a7a2 144 // paddles
jamesheavey 27:1b5038b0a7a2 145 _p1.draw(lcd);
jamesheavey 27:1b5038b0a7a2 146 // ball
jamesheavey 27:1b5038b0a7a2 147 _ball.draw(lcd);
jamesheavey 27:1b5038b0a7a2 148
jamesheavey 27:1b5038b0a7a2 149 //print_scores(lcd);
jamesheavey 27:1b5038b0a7a2 150
jamesheavey 39:a9bb03bef107 151 for (it_R = listofBricks.begin(); it_R != listofBricks.end(); ++it_R){
jamesheavey 39:a9bb03bef107 152 it_R->draw(lcd);
jamesheavey 34:07ded1f83c59 153 }
jamesheavey 35:3a614d539a54 154 for (it_L = listofLasers.begin(); it_L != listofLasers.end(); ++it_L){
jamesheavey 35:3a614d539a54 155 it_L->draw(lcd);
jamesheavey 35:3a614d539a54 156 }
jamesheavey 27:1b5038b0a7a2 157
jamesheavey 27:1b5038b0a7a2 158 }
jamesheavey 27:1b5038b0a7a2 159
jamesheavey 27:1b5038b0a7a2 160
jamesheavey 27:1b5038b0a7a2 161 void BreakoutEngine::update(Gamepad &pad)
jamesheavey 27:1b5038b0a7a2 162 {
jamesheavey 27:1b5038b0a7a2 163 check_goal(pad);
jamesheavey 27:1b5038b0a7a2 164 // important to update paddles and ball before checking collisions so can
jamesheavey 27:1b5038b0a7a2 165 // correct for it before updating the display
jamesheavey 27:1b5038b0a7a2 166 _p1.update(_d,_mag);
jamesheavey 27:1b5038b0a7a2 167 _ball.update();
jamesheavey 35:3a614d539a54 168
jamesheavey 35:3a614d539a54 169 for (it_L = listofLasers.begin(); it_L != listofLasers.end(); ++it_L){
jamesheavey 35:3a614d539a54 170 it_L->update();
jamesheavey 35:3a614d539a54 171 }
jamesheavey 35:3a614d539a54 172
jamesheavey 27:1b5038b0a7a2 173 lives_leds(pad);
jamesheavey 27:1b5038b0a7a2 174
jamesheavey 42:347c20a16ee6 175 check_wall_collisions(pad);
jamesheavey 27:1b5038b0a7a2 176 check_paddle_collisions(pad);
jamesheavey 27:1b5038b0a7a2 177 check_brick_collisions(pad);
jamesheavey 36:cb73014d3a99 178 check_laser_collisions(pad);
jamesheavey 35:3a614d539a54 179
jamesheavey 35:3a614d539a54 180
jamesheavey 27:1b5038b0a7a2 181 }
jamesheavey 27:1b5038b0a7a2 182
jamesheavey 27:1b5038b0a7a2 183 void BreakoutEngine::lives_leds(Gamepad &pad)
jamesheavey 27:1b5038b0a7a2 184 {
jamesheavey 27:1b5038b0a7a2 185 if (_p1.get_lives() == 0) {
jamesheavey 27:1b5038b0a7a2 186 pad.leds_off();
jamesheavey 27:1b5038b0a7a2 187 }
jamesheavey 27:1b5038b0a7a2 188
jamesheavey 27:1b5038b0a7a2 189 else if (_p1.get_lives() == 1) {
jamesheavey 27:1b5038b0a7a2 190 //turn leftmost led on
jamesheavey 27:1b5038b0a7a2 191 pad.leds_off();
jamesheavey 27:1b5038b0a7a2 192 pad.led(1,1);
jamesheavey 27:1b5038b0a7a2 193 }
jamesheavey 27:1b5038b0a7a2 194
jamesheavey 27:1b5038b0a7a2 195 else if (_p1.get_lives() == 2) {
jamesheavey 27:1b5038b0a7a2 196 //turn leftmost led on
jamesheavey 27:1b5038b0a7a2 197 pad.leds_off();
jamesheavey 27:1b5038b0a7a2 198 pad.led(1,1);
jamesheavey 27:1b5038b0a7a2 199 pad.led(2,1);
jamesheavey 27:1b5038b0a7a2 200 }
jamesheavey 27:1b5038b0a7a2 201
jamesheavey 27:1b5038b0a7a2 202 else if (_p1.get_lives() == 3) {
jamesheavey 27:1b5038b0a7a2 203 //turn leftmost led on
jamesheavey 27:1b5038b0a7a2 204 pad.leds_off();
jamesheavey 27:1b5038b0a7a2 205 pad.led(1,1);
jamesheavey 27:1b5038b0a7a2 206 pad.led(2,1);
jamesheavey 27:1b5038b0a7a2 207 pad.led(3,1);
jamesheavey 27:1b5038b0a7a2 208 }
jamesheavey 27:1b5038b0a7a2 209
jamesheavey 27:1b5038b0a7a2 210 else if (_p1.get_lives() == 4) {
jamesheavey 27:1b5038b0a7a2 211 pad.leds_on();
jamesheavey 27:1b5038b0a7a2 212 pad.led(5,0);
jamesheavey 27:1b5038b0a7a2 213 pad.led(6,0);
jamesheavey 27:1b5038b0a7a2 214 }
jamesheavey 27:1b5038b0a7a2 215
jamesheavey 27:1b5038b0a7a2 216 else if (_p1.get_lives() == 5) {
jamesheavey 27:1b5038b0a7a2 217 pad.leds_on();
jamesheavey 27:1b5038b0a7a2 218 pad.led(6,0);
jamesheavey 27:1b5038b0a7a2 219 }
jamesheavey 27:1b5038b0a7a2 220
jamesheavey 27:1b5038b0a7a2 221 else if (_p1.get_lives() == 6) {
jamesheavey 27:1b5038b0a7a2 222 pad.leds_on();
jamesheavey 27:1b5038b0a7a2 223 }
jamesheavey 27:1b5038b0a7a2 224 }
jamesheavey 27:1b5038b0a7a2 225
jamesheavey 27:1b5038b0a7a2 226 int BreakoutEngine::get_lives() {
jamesheavey 27:1b5038b0a7a2 227 return _p1.get_lives();
jamesheavey 27:1b5038b0a7a2 228 }
jamesheavey 27:1b5038b0a7a2 229
jamesheavey 42:347c20a16ee6 230 void BreakoutEngine::check_wall_collisions(Gamepad &pad)
jamesheavey 27:1b5038b0a7a2 231 {
jamesheavey 27:1b5038b0a7a2 232 // read current ball attributes
jamesheavey 27:1b5038b0a7a2 233 Vector2D ball_pos = _ball.get_pos();
jamesheavey 27:1b5038b0a7a2 234 Vector2D ball_velocity = _ball.get_velocity();
jamesheavey 27:1b5038b0a7a2 235
jamesheavey 40:ac53905346fb 236 if (ball_pos.y <= GAP_TOP - 1) { // 1 due to 1 pixel boundary
jamesheavey 40:ac53905346fb 237 ball_pos.y = GAP_TOP - 1; // bounce off ceiling without going off screen
jamesheavey 27:1b5038b0a7a2 238 ball_velocity.y = -ball_velocity.y;
jamesheavey 27:1b5038b0a7a2 239 // audio feedback
jamesheavey 27:1b5038b0a7a2 240 pad.tone(750.0,0.1);
jamesheavey 27:1b5038b0a7a2 241 }
jamesheavey 27:1b5038b0a7a2 242
jamesheavey 27:1b5038b0a7a2 243 else if (ball_pos.x <= 1) { // 1 due to 1 pixel boundary
jamesheavey 27:1b5038b0a7a2 244 ball_pos.x = 1; // bounce off ceiling without going off screen
jamesheavey 27:1b5038b0a7a2 245 ball_velocity.x = -ball_velocity.x;
jamesheavey 27:1b5038b0a7a2 246 // audio feedback
jamesheavey 27:1b5038b0a7a2 247 pad.tone(750.0,0.1);
jamesheavey 27:1b5038b0a7a2 248 }
jamesheavey 27:1b5038b0a7a2 249
jamesheavey 27:1b5038b0a7a2 250 // check if hit bottom wall
jamesheavey 27:1b5038b0a7a2 251 else if (ball_pos.x + _ball_size >= (WIDTH-1) ) { // bottom pixel is 47
jamesheavey 27:1b5038b0a7a2 252 // hit bottom
jamesheavey 27:1b5038b0a7a2 253 ball_pos.x = (WIDTH-1) - _ball_size; // stops ball going off screen
jamesheavey 27:1b5038b0a7a2 254 ball_velocity.x = -ball_velocity.x;
jamesheavey 27:1b5038b0a7a2 255 // audio feedback
jamesheavey 27:1b5038b0a7a2 256 pad.tone(750.0,0.1);
jamesheavey 27:1b5038b0a7a2 257 }
jamesheavey 27:1b5038b0a7a2 258
jamesheavey 27:1b5038b0a7a2 259 // update ball parameters
jamesheavey 27:1b5038b0a7a2 260 _ball.set_velocity(ball_velocity);
jamesheavey 27:1b5038b0a7a2 261 _ball.set_pos(ball_pos);
jamesheavey 27:1b5038b0a7a2 262
jamesheavey 42:347c20a16ee6 263 for (it_L = listofLasers.begin(); it_L != listofLasers.end(); ++it_L){
jamesheavey 41:fe383cbb51b2 264 if (
jamesheavey 42:347c20a16ee6 265 (it_L -> get_y() <= GAP_TOP - 2)
jamesheavey 41:fe383cbb51b2 266 ) { // edit this so that if it hits the middle, reflect, else change angle depending on how far off centre (add angle to ball)
jamesheavey 41:fe383cbb51b2 267 // if it has, fix position and reflect x velocity
jamesheavey 41:fe383cbb51b2 268 it_L -> set_posx(-10);
jamesheavey 41:fe383cbb51b2 269 }
jamesheavey 41:fe383cbb51b2 270 }
jamesheavey 42:347c20a16ee6 271
jamesheavey 41:fe383cbb51b2 272 }
jamesheavey 41:fe383cbb51b2 273
jamesheavey 27:1b5038b0a7a2 274 void BreakoutEngine::check_paddle_collisions(Gamepad &pad)
jamesheavey 27:1b5038b0a7a2 275 {
jamesheavey 27:1b5038b0a7a2 276 // read current ball attributes
jamesheavey 27:1b5038b0a7a2 277 Vector2D ball_pos = _ball.get_pos();
jamesheavey 27:1b5038b0a7a2 278 Vector2D ball_velocity = _ball.get_velocity();
jamesheavey 27:1b5038b0a7a2 279
jamesheavey 27:1b5038b0a7a2 280 // check p1 first
jamesheavey 27:1b5038b0a7a2 281 Vector2D p1_pos = _p1.get_pos();
jamesheavey 27:1b5038b0a7a2 282
jamesheavey 27:1b5038b0a7a2 283 // see if ball has hit the paddle by checking for overlaps
jamesheavey 27:1b5038b0a7a2 284 if (
jamesheavey 27:1b5038b0a7a2 285 (ball_pos.x >= p1_pos.x) && //left
jamesheavey 27:1b5038b0a7a2 286 (ball_pos.x <= p1_pos.x + _paddle_width) && //right
jamesheavey 27:1b5038b0a7a2 287 (ball_pos.y >= _p1y) && //bottom
jamesheavey 27:1b5038b0a7a2 288 (ball_pos.y <= _p1y + _paddle_height) //top
jamesheavey 27:1b5038b0a7a2 289 ) { // edit this so that if it hits the middle, reflect, else change angle depending on how far off centre (add angle to ball)
jamesheavey 27:1b5038b0a7a2 290 // if it has, fix position and reflect x velocity
jamesheavey 27:1b5038b0a7a2 291 pad.tone(1000.0,0.1);
jamesheavey 27:1b5038b0a7a2 292 ball_pos.y = _p1y + _paddle_height - 1;
jamesheavey 27:1b5038b0a7a2 293 ball_velocity.y = -ball_velocity.y;
jamesheavey 27:1b5038b0a7a2 294
jamesheavey 27:1b5038b0a7a2 295 // if (ball_pos.x == p1_pos.x + PADDLE_WIDTH/2) { // check ballxpos in relation to paddle xpos. translate the distance from the centre to an angle between 30 and 60 degrees in that direction
jamesheavey 27:1b5038b0a7a2 296 // ball_pos.y = _p1y + _paddle_height - 1;
jamesheavey 27:1b5038b0a7a2 297 // ball_velocity.y = -ball_velocity.y;
jamesheavey 27:1b5038b0a7a2 298 // }
jamesheavey 27:1b5038b0a7a2 299 // else if (ball_pos.x <= p1_pos.x + PADDLE_WIDTH/2) {
jamesheavey 27:1b5038b0a7a2 300 // float ang = 40*(((p1_pos.x + PADDLE_WIDTH/2)-ball_pos.x)/(PADDLE_WIDTH/2 - p1_pos.x)) + 30; //converts the distance from the centre to an angle between 30 and 60
jamesheavey 27:1b5038b0a7a2 301 // if (ball_velocity.x > 0) {
jamesheavey 27:1b5038b0a7a2 302 // ball_velocity.x = -ball_velocity.x;
jamesheavey 27:1b5038b0a7a2 303 // }
jamesheavey 27:1b5038b0a7a2 304 // ball_pos.y = _p1y + _paddle_heigh - 1;
jamesheavey 27:1b5038b0a7a2 305 // ball_velocity.y = -tan(ang);
jamesheavey 27:1b5038b0a7a2 306 // }
jamesheavey 27:1b5038b0a7a2 307 // else if (ball_pos.x >= p1_pos.x + PADDLE_WIDTH/2) {
jamesheavey 27:1b5038b0a7a2 308 // float ang = 40*(((p1_pos.x + PADDLE_WIDTH/2)-ball_pos.x)/(PADDLE_WIDTH/2 - p1_pos.x)) + 30; //converts the distance from the centre to an angle between 30 and 60
jamesheavey 27:1b5038b0a7a2 309 // if (ball_velocity.x < 0) {
jamesheavey 27:1b5038b0a7a2 310 // ball_velocity.x = -ball_velocity.x;
jamesheavey 27:1b5038b0a7a2 311 // }
jamesheavey 27:1b5038b0a7a2 312 // ball_pos.y = _p1y + _paddle_height - 1;
jamesheavey 27:1b5038b0a7a2 313 // ball_velocity.y = -tan(ang);
jamesheavey 27:1b5038b0a7a2 314 // }
jamesheavey 27:1b5038b0a7a2 315 }
jamesheavey 27:1b5038b0a7a2 316
jamesheavey 27:1b5038b0a7a2 317 // write new attributes
jamesheavey 27:1b5038b0a7a2 318 _ball.set_velocity(ball_velocity);
jamesheavey 27:1b5038b0a7a2 319 _ball.set_pos(ball_pos);
jamesheavey 27:1b5038b0a7a2 320 }
jamesheavey 27:1b5038b0a7a2 321
jamesheavey 27:1b5038b0a7a2 322 void BreakoutEngine::check_brick_collisions(Gamepad &pad)
jamesheavey 27:1b5038b0a7a2 323 {
jamesheavey 27:1b5038b0a7a2 324 // read current ball attributes
jamesheavey 27:1b5038b0a7a2 325 Vector2D ball_pos = _ball.get_pos();
jamesheavey 27:1b5038b0a7a2 326 Vector2D ball_velocity = _ball.get_velocity();
jamesheavey 27:1b5038b0a7a2 327
jamesheavey 39:a9bb03bef107 328 for (it_R = listofBricks.begin(); it_R != listofBricks.end(); ++it_R){
jamesheavey 34:07ded1f83c59 329 if (
jamesheavey 39:a9bb03bef107 330 (ball_pos.x >= it_R -> get_x()) && //left
jamesheavey 39:a9bb03bef107 331 (ball_pos.x <= it_R -> get_x() + BRICK_WIDTH) && //right
jamesheavey 39:a9bb03bef107 332 (ball_pos.y >= it_R -> get_y()) && //bottom
jamesheavey 39:a9bb03bef107 333 (ball_pos.y <= it_R -> get_y() + BRICK_HEIGHT) //top
jamesheavey 34:07ded1f83c59 334 ) { // edit this so that if it hits the middle, reflect, else change angle depending on how far off centre (add angle to ball)
jamesheavey 34:07ded1f83c59 335 // if it has, fix position and reflect x velocity
jamesheavey 48:966f2cf803ec 336 if (ball_velocity.y < 0)
jamesheavey 48:966f2cf803ec 337 {
jamesheavey 48:966f2cf803ec 338 ball_pos.y = it_R -> get_y() + BRICK_HEIGHT;
jamesheavey 48:966f2cf803ec 339 }
jamesheavey 48:966f2cf803ec 340 else
jamesheavey 48:966f2cf803ec 341 {
jamesheavey 48:966f2cf803ec 342 ball_pos.y = it_R -> get_y();
jamesheavey 48:966f2cf803ec 343 }
jamesheavey 34:07ded1f83c59 344 ball_velocity.y = -ball_velocity.y;
jamesheavey 34:07ded1f83c59 345 // audio feedback
jamesheavey 34:07ded1f83c59 346 pad.tone(1000.0,0.1);
jamesheavey 39:a9bb03bef107 347 it_R -> hit();
jamesheavey 39:a9bb03bef107 348 it_R -> hit();
jamesheavey 34:07ded1f83c59 349 //delete _brick11;
jamesheavey 39:a9bb03bef107 350 it_R -> set_posx(-100);
jamesheavey 39:a9bb03bef107 351 it_R -> set_posy(-100);
jamesheavey 34:07ded1f83c59 352 one_less();
jamesheavey 34:07ded1f83c59 353 }
jamesheavey 27:1b5038b0a7a2 354 }
jamesheavey 27:1b5038b0a7a2 355 // write new attributes
jamesheavey 27:1b5038b0a7a2 356 _ball.set_velocity(ball_velocity);
jamesheavey 27:1b5038b0a7a2 357 _ball.set_pos(ball_pos);
jamesheavey 27:1b5038b0a7a2 358 }
jamesheavey 36:cb73014d3a99 359
jamesheavey 32:4dba7a85dbb2 360 void BreakoutEngine::check_laser_collisions(Gamepad &pad)
jamesheavey 32:4dba7a85dbb2 361 {
jamesheavey 32:4dba7a85dbb2 362 // read current ball attributes
jamesheavey 34:07ded1f83c59 363 // check p1 first
jamesheavey 36:cb73014d3a99 364 for (it_L = listofLasers.begin(); it_L != listofLasers.end(); ++it_L){
jamesheavey 39:a9bb03bef107 365 for (it_R = listofBricks.begin(); it_R != listofBricks.end(); ++it_R){
jamesheavey 36:cb73014d3a99 366 if (
jamesheavey 39:a9bb03bef107 367 (it_L -> get_x() >= it_R -> get_x()) && //left
jamesheavey 39:a9bb03bef107 368 (it_L -> get_x() <= it_R -> get_x() + BRICK_WIDTH) && //right
jamesheavey 39:a9bb03bef107 369 (it_L -> get_y() >= it_R -> get_y()) && //bottom
jamesheavey 39:a9bb03bef107 370 (it_L -> get_y()<= it_R -> get_y() + BRICK_HEIGHT) //top
jamesheavey 36:cb73014d3a99 371 ) { // edit this so that if it hits the middle, reflect, else change angle depending on how far off centre (add angle to ball)
jamesheavey 36:cb73014d3a99 372 // if it has, fix position and reflect x velocity
jamesheavey 37:dd1538ae6534 373 it_L -> set_posx(-10);
jamesheavey 36:cb73014d3a99 374 // audio feedback
jamesheavey 36:cb73014d3a99 375 pad.tone(1000.0,0.1);
jamesheavey 39:a9bb03bef107 376 if(it_R->hit() == true) {
jamesheavey 39:a9bb03bef107 377 it_R -> set_posx(-100);
jamesheavey 39:a9bb03bef107 378 it_R -> set_posy(-100);
jamesheavey 36:cb73014d3a99 379 one_less();
jamesheavey 36:cb73014d3a99 380 }
jamesheavey 36:cb73014d3a99 381 }
jamesheavey 34:07ded1f83c59 382 }
jamesheavey 34:07ded1f83c59 383 }
jamesheavey 36:cb73014d3a99 384 }
jamesheavey 32:4dba7a85dbb2 385
jamesheavey 27:1b5038b0a7a2 386 bool BreakoutEngine::check_goal(Gamepad &pad)
jamesheavey 27:1b5038b0a7a2 387 {
jamesheavey 27:1b5038b0a7a2 388 Vector2D ball_pos = _ball.get_pos();
jamesheavey 27:1b5038b0a7a2 389 // P1 has scored
jamesheavey 27:1b5038b0a7a2 390 if (ball_pos.y > HEIGHT) {
jamesheavey 27:1b5038b0a7a2 391 _p1.lose_life();
jamesheavey 27:1b5038b0a7a2 392 //lose_screen(); // go to loss screen then initialise again
jamesheavey 27:1b5038b0a7a2 393
jamesheavey 27:1b5038b0a7a2 394 _ball.init(_ball_size,_speed);
jamesheavey 27:1b5038b0a7a2 395 pad.tone(1500.0,0.5);
jamesheavey 27:1b5038b0a7a2 396 return true;
jamesheavey 27:1b5038b0a7a2 397 }
jamesheavey 27:1b5038b0a7a2 398 else {
jamesheavey 27:1b5038b0a7a2 399 return false;
jamesheavey 27:1b5038b0a7a2 400 }
jamesheavey 27:1b5038b0a7a2 401 }
jamesheavey 27:1b5038b0a7a2 402
jamesheavey 27:1b5038b0a7a2 403
jamesheavey 27:1b5038b0a7a2 404
jamesheavey 34:07ded1f83c59 405 void BreakoutEngine::print_scores(N5110 &lcd) //maybe add to oneless
jamesheavey 27:1b5038b0a7a2 406 {
jamesheavey 27:1b5038b0a7a2 407 // get scores from paddles
jamesheavey 47:1d1a827be81b 408 int multiplier = get_prev_score()/1800 + 1;
jamesheavey 47:1d1a827be81b 409 int p1_score = get_prev_score() + (18 - get_num_left())*100 * multiplier; //maybe add a previous score so the score carries over through victory screens. add hi score fix so restart restarts from 321
jamesheavey 40:ac53905346fb 410 // also, add a multiplier of 2 for every contiue on victory
jamesheavey 27:1b5038b0a7a2 411 // print to LCD i
jamesheavey 27:1b5038b0a7a2 412 char buffer1[14];
jamesheavey 27:1b5038b0a7a2 413 sprintf(buffer1,"%2d",p1_score);
jamesheavey 40:ac53905346fb 414 lcd.printString("SCORE: ",2 ,0);
jamesheavey 40:ac53905346fb 415 lcd.printString(buffer1,WIDTH/2 -2,0); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits
jamesheavey 27:1b5038b0a7a2 416 }
jamesheavey 47:1d1a827be81b 417 int BreakoutEngine::get_prev_score(){
jamesheavey 47:1d1a827be81b 418 return _prev_score;
jamesheavey 47:1d1a827be81b 419 }
jamesheavey 27:1b5038b0a7a2 420 int BreakoutEngine::get_num_left(){
jamesheavey 27:1b5038b0a7a2 421 return _number_left;
jamesheavey 27:1b5038b0a7a2 422 }
jamesheavey 27:1b5038b0a7a2 423 void BreakoutEngine::one_less() {
jamesheavey 27:1b5038b0a7a2 424 _number_left -= 1;
jamesheavey 27:1b5038b0a7a2 425 }