Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
BreakoutEngine/BreakoutEngine.cpp@48:966f2cf803ec, 2019-04-26 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |