
Kaif Kutchwala 201267448 ELEC2645 Project
Dependencies: mbed
Ball/Ball.cpp@31:e1f80d181779, 2020-05-26 (annotated)
- Committer:
- KaifK
- Date:
- Tue May 26 15:50:46 2020 +0000
- Revision:
- 31:e1f80d181779
- Parent:
- 30:abe30c123470
Final Submission. I have read and agreed with Statement of Academic Integrity.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
KaifK | 2:21973e665a32 | 1 | #include "Ball.h" |
KaifK | 2:21973e665a32 | 2 | |
KaifK | 25:467d8fd0fec4 | 3 | Ball::Ball(N5110 &lcd) { |
KaifK | 25:467d8fd0fec4 | 4 | _lcd = &lcd; |
KaifK | 25:467d8fd0fec4 | 5 | } |
KaifK | 4:08a0ff6668df | 6 | |
KaifK | 5:ed71996c0534 | 7 | Ball::~Ball() {} |
KaifK | 5:ed71996c0534 | 8 | |
KaifK | 25:467d8fd0fec4 | 9 | void Ball::init() { |
KaifK | 5:ed71996c0534 | 10 | _ball_x = BALL_INIT_X; |
KaifK | 5:ed71996c0534 | 11 | _ball_y = BALL_INIT_Y; |
KaifK | 15:5bf3f951d337 | 12 | _radius = 6; |
KaifK | 21:d5b1160f349f | 13 | _level = 1; |
KaifK | 5:ed71996c0534 | 14 | } |
KaifK | 5:ed71996c0534 | 15 | |
KaifK | 25:467d8fd0fec4 | 16 | void Ball::drawBall(int x, int y, int radius) { |
KaifK | 21:d5b1160f349f | 17 | _ball_x = x; |
KaifK | 21:d5b1160f349f | 18 | _ball_y = y; |
KaifK | 21:d5b1160f349f | 19 | _radius = radius; |
KaifK | 15:5bf3f951d337 | 20 | //white background so visible over obstacles |
KaifK | 25:467d8fd0fec4 | 21 | _lcd -> drawCircle(_ball_x, _ball_y, _radius, FILL_WHITE); |
KaifK | 25:467d8fd0fec4 | 22 | _lcd -> drawCircle(_ball_x, _ball_y, _radius, FILL_TRANSPARENT); //outline |
KaifK | 25:467d8fd0fec4 | 23 | _lcd -> drawCircle(_ball_x, _ball_y, (_radius / 2), FILL_BLACK); //centre circle |
KaifK | 25:467d8fd0fec4 | 24 | _lcd -> drawLine(_ball_x, (_ball_y - _radius), _ball_x, (_ball_y + _radius), 1); //vertical line |
KaifK | 25:467d8fd0fec4 | 25 | _lcd -> drawLine((_ball_x - _radius), _ball_y, (_ball_x + _radius), _ball_y, 1); //horizontal line |
KaifK | 5:ed71996c0534 | 26 | } |
KaifK | 2:21973e665a32 | 27 | |
KaifK | 25:467d8fd0fec4 | 28 | void Ball::playShot(int user_input_x, int user_input_y) { |
KaifK | 28:215e8327d4e6 | 29 | int delay = 0; |
KaifK | 20:c697902b844f | 30 | //printf("level (in ball) = %d \n",_level); |
KaifK | 5:ed71996c0534 | 31 | _user_input_x = user_input_x; |
KaifK | 5:ed71996c0534 | 32 | _user_input_y = user_input_y; |
KaifK | 28:215e8327d4e6 | 33 | //convert _user_input_y (range 3-28) to delay in range 10-40 ms |
KaifK | 28:215e8327d4e6 | 34 | //max power shortest delay i.e. ball moves faster and vice versa |
KaifK | 28:215e8327d4e6 | 35 | delay = (((_user_input_y - 3) * (30)) / (25)) + 10 ; |
KaifK | 28:215e8327d4e6 | 36 | //printf("delay = %d \n",delay); |
KaifK | 26:04b2d7742a84 | 37 | //increase or decrease coordinate value until input coordinates are reached |
KaifK | 25:467d8fd0fec4 | 38 | while (_user_input_x < _ball_x || _user_input_y < _ball_y) { |
KaifK | 12:ca7329a41fc5 | 39 | displayBackground(); |
KaifK | 26:04b2d7742a84 | 40 | //decide direction based on whether coordinate is less or greater |
KaifK | 25:467d8fd0fec4 | 41 | if (_user_input_x < _ball_x) { _ball_x -= 1; } |
KaifK | 25:467d8fd0fec4 | 42 | else if (_user_input_x > _ball_x) { _ball_x += 1; } |
KaifK | 25:467d8fd0fec4 | 43 | if (_user_input_y < _ball_y) {_ball_y -= 1; } |
KaifK | 25:467d8fd0fec4 | 44 | else if (_user_input_y > _ball_y) { _ball_y += 1; } |
KaifK | 15:5bf3f951d337 | 45 | drawBall(_ball_x, _ball_y, _radius); |
KaifK | 25:467d8fd0fec4 | 46 | if (_ball_y >= 35) { _radius = 5; } //ball moved further so reduce size |
KaifK | 25:467d8fd0fec4 | 47 | else if (_ball_y <= 30) { _radius = 3; } //ball is furthest & smallest |
KaifK | 20:c697902b844f | 48 | //printf("ball x pos = %d \n", _ball_x); |
KaifK | 9:e6566d09f087 | 49 | //printf("ball y pos = %d \n", _ball_y); |
KaifK | 28:215e8327d4e6 | 50 | wait_ms(delay); |
KaifK | 25:467d8fd0fec4 | 51 | _lcd -> refresh(); |
KaifK | 25:467d8fd0fec4 | 52 | _lcd -> clear(); |
KaifK | 2:21973e665a32 | 53 | } |
KaifK | 5:ed71996c0534 | 54 | } |
KaifK | 5:ed71996c0534 | 55 | |
KaifK | 25:467d8fd0fec4 | 56 | void Ball::displayBackground() { |
KaifK | 8:5ede90f99a27 | 57 | //draw goal |
KaifK | 25:467d8fd0fec4 | 58 | _lcd -> drawSprite(7, 0, 24, 70, (int * ) goal); |
KaifK | 8:5ede90f99a27 | 59 | //draw grass |
KaifK | 25:467d8fd0fec4 | 60 | _lcd -> drawSprite(1, 17, 7, 7, (int * ) grass); |
KaifK | 25:467d8fd0fec4 | 61 | _lcd -> drawSprite(76, 17, 7, 7, (int * ) grass); |
KaifK | 25:467d8fd0fec4 | 62 | _lcd -> drawSprite(67, 26, 3, 3, (int * ) grass_small); |
KaifK | 25:467d8fd0fec4 | 63 | _lcd -> drawSprite(67, 26, 3, 3, (int * ) grass_small); |
KaifK | 30:abe30c123470 | 64 | _lcd -> drawSprite(6, 33, 3, 3, (int * ) grass_small); |
KaifK | 25:467d8fd0fec4 | 65 | _lcd -> drawSprite(72, 32, 3, 3, (int * ) grass_small); |
KaifK | 30:abe30c123470 | 66 | _lcd -> drawSprite(55, 43, 3, 3, (int * ) grass_small); |
KaifK | 30:abe30c123470 | 67 | _lcd -> drawSprite(20, 39, 3, 3, (int * ) grass_small); |
KaifK | 25:467d8fd0fec4 | 68 | _lcd -> drawSprite(16, 29, 3, 3, (int * ) grass_small); |
KaifK | 8:5ede90f99a27 | 69 | //ground line |
KaifK | 25:467d8fd0fec4 | 70 | _lcd -> drawLine(0, 24, 84, 24, 1); |
KaifK | 8:5ede90f99a27 | 71 | //score card |
KaifK | 25:467d8fd0fec4 | 72 | _lcd -> drawRect(0, 38, 15, 11, FILL_TRANSPARENT); |
KaifK | 8:5ede90f99a27 | 73 | //power meter |
KaifK | 25:467d8fd0fec4 | 74 | _lcd -> drawRect(77, 27, 6, 20, FILL_TRANSPARENT); |
KaifK | 12:ca7329a41fc5 | 75 | //display level |
KaifK | 12:ca7329a41fc5 | 76 | displayLevel(_level); |
KaifK | 12:ca7329a41fc5 | 77 | } |
KaifK | 17:2fbe40177b9c | 78 | bool Ball::isGoal(int level, int x, int y) { |
KaifK | 20:c697902b844f | 79 | //printf("Checking if goal"); |
KaifK | 12:ca7329a41fc5 | 80 | _goal = false; |
KaifK | 12:ca7329a41fc5 | 81 | if(level == 1) { check_level_1(x, y); } |
KaifK | 12:ca7329a41fc5 | 82 | else if(level == 2) { check_level_2(x, y); } |
KaifK | 12:ca7329a41fc5 | 83 | else if(level == 3) { check_level_3(x, y); } |
KaifK | 12:ca7329a41fc5 | 84 | else if(level == 4) { check_level_4(x, y); } |
KaifK | 12:ca7329a41fc5 | 85 | else if(level == 5) { check_level_5(x, y); } |
KaifK | 12:ca7329a41fc5 | 86 | else if(level == 6) { check_level_6(x, y); } |
KaifK | 12:ca7329a41fc5 | 87 | else if(level == 7) { check_level_7(x, y); } |
KaifK | 12:ca7329a41fc5 | 88 | else if(level == 8) { check_level_8(x, y); } |
KaifK | 12:ca7329a41fc5 | 89 | else if(level == 9) { check_level_9(x, y); } |
KaifK | 12:ca7329a41fc5 | 90 | else if(level == 10) { check_level_10(x, y); } |
KaifK | 20:c697902b844f | 91 | //printf("goal_status = %d \n" , _goal); |
KaifK | 17:2fbe40177b9c | 92 | return _goal; |
KaifK | 8:5ede90f99a27 | 93 | } |
KaifK | 5:ed71996c0534 | 94 | |
KaifK | 25:467d8fd0fec4 | 95 | void Ball::set_level(int level) { |
KaifK | 10:dbc149804a06 | 96 | _level = level; |
KaifK | 10:dbc149804a06 | 97 | } |
KaifK | 10:dbc149804a06 | 98 | int Ball::get_level() { |
KaifK | 10:dbc149804a06 | 99 | int val = _level; |
KaifK | 5:ed71996c0534 | 100 | return val; |
KaifK | 8:5ede90f99a27 | 101 | } |
KaifK | 21:d5b1160f349f | 102 | Vector2D Ball::get_position() { |
KaifK | 25:467d8fd0fec4 | 103 | Vector2D val = { |
KaifK | 25:467d8fd0fec4 | 104 | _ball_x, |
KaifK | 25:467d8fd0fec4 | 105 | _ball_y |
KaifK | 25:467d8fd0fec4 | 106 | }; |
KaifK | 21:d5b1160f349f | 107 | return val; |
KaifK | 21:d5b1160f349f | 108 | } |
KaifK | 12:ca7329a41fc5 | 109 | void Ball::displayLevel(int level) { |
KaifK | 26:04b2d7742a84 | 110 | if(level == 1) { level_1(); } |
KaifK | 12:ca7329a41fc5 | 111 | else if(level == 2) { level_2(); } |
KaifK | 12:ca7329a41fc5 | 112 | else if(level == 3) { level_3(); } |
KaifK | 12:ca7329a41fc5 | 113 | else if(level == 4) { level_4(); } |
KaifK | 12:ca7329a41fc5 | 114 | else if(level == 5) { level_5(); } |
KaifK | 12:ca7329a41fc5 | 115 | else if(level == 6) { level_6(); } |
KaifK | 12:ca7329a41fc5 | 116 | else if(level == 7) { level_7(); } |
KaifK | 12:ca7329a41fc5 | 117 | else if(level == 8) { level_8(); } |
KaifK | 12:ca7329a41fc5 | 118 | else if(level == 9) { level_9(); } |
KaifK | 12:ca7329a41fc5 | 119 | else if(level == 10) { level_10(); } |
KaifK | 13:5133f00d2a2d | 120 | else { error("Invalid Level"); } |
KaifK | 12:ca7329a41fc5 | 121 | } |
KaifK | 12:ca7329a41fc5 | 122 | void Ball::level_1() { |
KaifK | 25:467d8fd0fec4 | 123 | _lcd -> drawRect(8, 1, 68, 24, FILL_TRANSPARENT); /// goal is completely open |
KaifK | 12:ca7329a41fc5 | 124 | } |
KaifK | 12:ca7329a41fc5 | 125 | void Ball::level_2() { |
KaifK | 25:467d8fd0fec4 | 126 | _lcd -> drawRect(8, 1, 34, 24, FILL_BLACK); /// LEFT HALF BLOCKED |
KaifK | 12:ca7329a41fc5 | 127 | } |
KaifK | 12:ca7329a41fc5 | 128 | void Ball::level_3() { |
KaifK | 25:467d8fd0fec4 | 129 | _lcd -> drawRect(42, 1, 34, 24, FILL_BLACK); /// RIGHT HALF BLOCKED |
KaifK | 12:ca7329a41fc5 | 130 | } |
KaifK | 12:ca7329a41fc5 | 131 | void Ball::level_4() { |
KaifK | 25:467d8fd0fec4 | 132 | _lcd -> drawRect(31, 1, 22, 24, FILL_BLACK); /// MIDDLE BLOCKED |
KaifK | 12:ca7329a41fc5 | 133 | } |
KaifK | 12:ca7329a41fc5 | 134 | void Ball::level_5() { |
KaifK | 25:467d8fd0fec4 | 135 | _lcd -> drawRect(8, 1, 68, 8, FILL_BLACK); /// TOP HALF BLOCKED |
KaifK | 12:ca7329a41fc5 | 136 | } |
KaifK | 12:ca7329a41fc5 | 137 | void Ball::level_6() { |
KaifK | 25:467d8fd0fec4 | 138 | _lcd -> drawRect(8, 16, 68, 8, FILL_BLACK); /// BOTTOM HALF BLOCKED |
KaifK | 12:ca7329a41fc5 | 139 | } |
KaifK | 17:2fbe40177b9c | 140 | void Ball::level_7() { /// CENTRE OPEN |
KaifK | 25:467d8fd0fec4 | 141 | _lcd -> drawRect(8, 1, 68, 5, FILL_BLACK); |
KaifK | 25:467d8fd0fec4 | 142 | _lcd -> drawRect(8, 19, 68, 5, FILL_BLACK); |
KaifK | 25:467d8fd0fec4 | 143 | _lcd -> drawRect(8, 1, 18, 24, FILL_BLACK); |
KaifK | 25:467d8fd0fec4 | 144 | _lcd -> drawRect(58, 1, 18, 24, FILL_BLACK); |
KaifK | 12:ca7329a41fc5 | 145 | } |
KaifK | 12:ca7329a41fc5 | 146 | void Ball::level_8() { /// TOP LEFT CORNER OPEN = level3 + level6 |
KaifK | 12:ca7329a41fc5 | 147 | level_3(); |
KaifK | 25:467d8fd0fec4 | 148 | level_6(); |
KaifK | 12:ca7329a41fc5 | 149 | } |
KaifK | 12:ca7329a41fc5 | 150 | void Ball::level_9() { /// TOP RIGHT CORNER OPEN = level2 + level6 |
KaifK | 12:ca7329a41fc5 | 151 | level_2(); |
KaifK | 12:ca7329a41fc5 | 152 | level_6(); |
KaifK | 12:ca7329a41fc5 | 153 | } |
KaifK | 12:ca7329a41fc5 | 154 | void Ball::level_10() { /// BOTTOM CORNERS OPEN = level4 + level 5 |
KaifK | 12:ca7329a41fc5 | 155 | level_4(); |
KaifK | 12:ca7329a41fc5 | 156 | level_5(); |
KaifK | 12:ca7329a41fc5 | 157 | } |
KaifK | 25:467d8fd0fec4 | 158 | void Ball::check_level_1(int x, int y) { |
KaifK | 12:ca7329a41fc5 | 159 | // check if ball is within goal (ball must not hit poles hence, dimensions |
KaifK | 16:1f196a0e12be | 160 | // are smaller i.e. 8-78 -> 10-76 and 24-3 -> 24-5 |
KaifK | 25:467d8fd0fec4 | 161 | if (x >= 10 && x <= 76 && y <= 24 && y >= 5) { |
KaifK | 25:467d8fd0fec4 | 162 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 163 | } |
KaifK | 12:ca7329a41fc5 | 164 | } |
KaifK | 25:467d8fd0fec4 | 165 | void Ball::check_level_2(int x, int y) { |
KaifK | 25:467d8fd0fec4 | 166 | if (x >= 44 && x <= 76 && y <= 24 && y >= 5) { |
KaifK | 25:467d8fd0fec4 | 167 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 168 | } |
KaifK | 12:ca7329a41fc5 | 169 | } |
KaifK | 25:467d8fd0fec4 | 170 | void Ball::check_level_3(int x, int y) { |
KaifK | 25:467d8fd0fec4 | 171 | if (x >= 10 && x <= 44 && y <= 24 && y >= 5) { |
KaifK | 25:467d8fd0fec4 | 172 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 173 | } |
KaifK | 12:ca7329a41fc5 | 174 | } |
KaifK | 25:467d8fd0fec4 | 175 | void Ball::check_level_4(int x, int y) { |
KaifK | 15:5bf3f951d337 | 176 | // either left or right |
KaifK | 25:467d8fd0fec4 | 177 | if ((x >= 10 && x <= 29) || (x >= 55 && x <= 76)) { |
KaifK | 25:467d8fd0fec4 | 178 | if (y <= 24 && y >= 5) { |
KaifK | 25:467d8fd0fec4 | 179 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 180 | } |
KaifK | 25:467d8fd0fec4 | 181 | } |
KaifK | 12:ca7329a41fc5 | 182 | } |
KaifK | 25:467d8fd0fec4 | 183 | void Ball::check_level_5(int x, int y) { |
KaifK | 25:467d8fd0fec4 | 184 | if (x >= 10 && x <= 76 && y <= 24 && y >= 12) { |
KaifK | 25:467d8fd0fec4 | 185 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 186 | } |
KaifK | 12:ca7329a41fc5 | 187 | } |
KaifK | 25:467d8fd0fec4 | 188 | void Ball::check_level_6(int x, int y) { |
KaifK | 25:467d8fd0fec4 | 189 | if (x >= 10 && x <= 76 && y <= 12 && y >= 5) { |
KaifK | 25:467d8fd0fec4 | 190 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 191 | } |
KaifK | 12:ca7329a41fc5 | 192 | } |
KaifK | 25:467d8fd0fec4 | 193 | void Ball::check_level_7(int x, int y) { |
KaifK | 25:467d8fd0fec4 | 194 | if (x >= 26 && x <= 56 && y <= 19 && y >= 6) { |
KaifK | 25:467d8fd0fec4 | 195 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 196 | } |
KaifK | 12:ca7329a41fc5 | 197 | } |
KaifK | 25:467d8fd0fec4 | 198 | void Ball::check_level_8(int x, int y) { |
KaifK | 12:ca7329a41fc5 | 199 | // x conditons for level 3, y conditions for level 6 |
KaifK | 25:467d8fd0fec4 | 200 | if (x >= 10 && x <= 40 && y <= 12 && y >= 5) { |
KaifK | 25:467d8fd0fec4 | 201 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 202 | } |
KaifK | 12:ca7329a41fc5 | 203 | } |
KaifK | 25:467d8fd0fec4 | 204 | void Ball::check_level_9(int x, int y) { |
KaifK | 12:ca7329a41fc5 | 205 | // x conditons for level 2, y conditions for level 6 |
KaifK | 25:467d8fd0fec4 | 206 | if (x >= 44 && x <= 76 && y <= 12 && y >= 5) { |
KaifK | 25:467d8fd0fec4 | 207 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 208 | } |
KaifK | 12:ca7329a41fc5 | 209 | } |
KaifK | 25:467d8fd0fec4 | 210 | void Ball::check_level_10(int x, int y) { |
KaifK | 12:ca7329a41fc5 | 211 | // x conditons for level 4, y conditions for level 5 |
KaifK | 15:5bf3f951d337 | 212 | // either left or right |
KaifK | 25:467d8fd0fec4 | 213 | if ((x >= 10 && x <= 30) || (x >= 54 && x <= 76)) { |
KaifK | 25:467d8fd0fec4 | 214 | if (y <= 24 && y >= 12) { |
KaifK | 25:467d8fd0fec4 | 215 | _goal = true; |
KaifK | 25:467d8fd0fec4 | 216 | } |
KaifK | 25:467d8fd0fec4 | 217 | } |
KaifK | 12:ca7329a41fc5 | 218 | } |
KaifK | 11:59119247dd68 | 219 | /* |
KaifK | 11:59119247dd68 | 220 | void Ball::level_loop() { |
KaifK | 12:ca7329a41fc5 | 221 | displayBackground(); |
KaifK | 12:ca7329a41fc5 | 222 | level_2(); |
KaifK | 25:467d8fd0fec4 | 223 | _lcd -> refresh(); |
KaifK | 11:59119247dd68 | 224 | wait(5); |
KaifK | 25:467d8fd0fec4 | 225 | _lcd -> clear(); |
KaifK | 12:ca7329a41fc5 | 226 | displayBackground(); |
KaifK | 12:ca7329a41fc5 | 227 | level_3(); |
KaifK | 25:467d8fd0fec4 | 228 | _lcd -> refresh(); |
KaifK | 11:59119247dd68 | 229 | wait(5); |
KaifK | 25:467d8fd0fec4 | 230 | _lcd -> clear(); |
KaifK | 12:ca7329a41fc5 | 231 | displayBackground(); |
KaifK | 12:ca7329a41fc5 | 232 | level_4(); |
KaifK | 25:467d8fd0fec4 | 233 | _lcd -> refresh(); |
KaifK | 11:59119247dd68 | 234 | wait(5); |
KaifK | 25:467d8fd0fec4 | 235 | _lcd -> clear(); |
KaifK | 12:ca7329a41fc5 | 236 | displayBackground(); |
KaifK | 12:ca7329a41fc5 | 237 | level_5(); |
KaifK | 25:467d8fd0fec4 | 238 | _lcd -> refresh(); |
KaifK | 11:59119247dd68 | 239 | wait(5); |
KaifK | 25:467d8fd0fec4 | 240 | _lcd -> clear(); |
KaifK | 12:ca7329a41fc5 | 241 | displayBackground(); |
KaifK | 12:ca7329a41fc5 | 242 | level_6(); |
KaifK | 25:467d8fd0fec4 | 243 | _lcd -> refresh(); |
KaifK | 11:59119247dd68 | 244 | wait(5); |
KaifK | 25:467d8fd0fec4 | 245 | _lcd ->clear(); |
KaifK | 12:ca7329a41fc5 | 246 | displayBackground(); |
KaifK | 12:ca7329a41fc5 | 247 | level_7(); |
KaifK | 25:467d8fd0fec4 | 248 | _lcd -> refresh(); |
KaifK | 11:59119247dd68 | 249 | wait(5); |
KaifK | 25:467d8fd0fec4 | 250 | _lcd -> clear(); |
KaifK | 12:ca7329a41fc5 | 251 | displayBackground(); |
KaifK | 12:ca7329a41fc5 | 252 | level_8(); |
KaifK | 25:467d8fd0fec4 | 253 | _lcd -> refresh(); |
KaifK | 11:59119247dd68 | 254 | wait(5); |
KaifK | 25:467d8fd0fec4 | 255 | _lcd -> clear(); |
KaifK | 12:ca7329a41fc5 | 256 | displayBackground(); |
KaifK | 12:ca7329a41fc5 | 257 | level_9(); |
KaifK | 25:467d8fd0fec4 | 258 | _lcd -> refresh(); |
KaifK | 11:59119247dd68 | 259 | wait(5); |
KaifK | 25:467d8fd0fec4 | 260 | _lcd -> clear(); |
KaifK | 12:ca7329a41fc5 | 261 | displayBackground(); |
KaifK | 12:ca7329a41fc5 | 262 | level_10(); |
KaifK | 12:ca7329a41fc5 | 263 | } |
KaifK | 25:467d8fd0fec4 | 264 | */ |