Kaif Kutchwala 201267448 ELEC2645 Project

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 */