James Heavey / Mbed 2 deprecated EL17JH

Dependencies:   mbed

Committer:
jamesheavey
Date:
Fri Apr 26 07:07:42 2019 +0000
Revision:
40:ac53905346fb
Parent:
39:a9bb03bef107
Child:
41:fe383cbb51b2
Added a scoring mechanism, need to be able to continue upon victory and increase the score multiplier (reset on death)

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