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.
Map/Map.cpp@7:cd3cafda3dd4, 2019-04-10 (annotated)
- Committer:
- kocemax
- Date:
- Wed Apr 10 09:18:25 2019 +0000
- Revision:
- 7:cd3cafda3dd4
- Parent:
- 6:39bda45efeed
- Child:
- 8:9b77eea95088
Made a working collision and added 2 levels, can add more later. Also started doing power-ups but haven't finished yet. Need to think of some of them and also thinking of adding some randomisation to the ball<->pad collision.
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| kocemax | 5:12c179da4788 | 1 | #include "Map.h" | 
| kocemax | 6:39bda45efeed | 2 | #include "Ball.h" | 
| kocemax | 5:12c179da4788 | 3 | |
| kocemax | 7:cd3cafda3dd4 | 4 | void Level1::initBricks(Map & map) | 
| kocemax | 7:cd3cafda3dd4 | 5 | { | 
| kocemax | 7:cd3cafda3dd4 | 6 | int w = 41; | 
| kocemax | 7:cd3cafda3dd4 | 7 | int h = 2; | 
| kocemax | 7:cd3cafda3dd4 | 8 | int gap = 1; | 
| kocemax | 7:cd3cafda3dd4 | 9 | int y = 0; | 
| kocemax | 7:cd3cafda3dd4 | 10 | for (int j = 0; j < 7; ++j) { | 
| kocemax | 7:cd3cafda3dd4 | 11 | int x = 0; | 
| kocemax | 7:cd3cafda3dd4 | 12 | for (int i = 0; i < 2; ++i) { | 
| kocemax | 7:cd3cafda3dd4 | 13 | Brick b; | 
| kocemax | 7:cd3cafda3dd4 | 14 | b.x = x; | 
| kocemax | 7:cd3cafda3dd4 | 15 | b.y = y; | 
| kocemax | 7:cd3cafda3dd4 | 16 | b.w = w; | 
| kocemax | 7:cd3cafda3dd4 | 17 | b.h = h; | 
| kocemax | 7:cd3cafda3dd4 | 18 | map.addBrick(b); | 
| kocemax | 7:cd3cafda3dd4 | 19 | |
| kocemax | 7:cd3cafda3dd4 | 20 | x += w + gap; | 
| kocemax | 7:cd3cafda3dd4 | 21 | } | 
| kocemax | 7:cd3cafda3dd4 | 22 | y += h + gap; | 
| kocemax | 7:cd3cafda3dd4 | 23 | } | 
| kocemax | 7:cd3cafda3dd4 | 24 | } | 
| kocemax | 7:cd3cafda3dd4 | 25 | |
| kocemax | 7:cd3cafda3dd4 | 26 | void Level2::initBricks(Map & map) | 
| kocemax | 7:cd3cafda3dd4 | 27 | { | 
| kocemax | 7:cd3cafda3dd4 | 28 | int w = 5; | 
| kocemax | 7:cd3cafda3dd4 | 29 | int h = 1; | 
| kocemax | 7:cd3cafda3dd4 | 30 | int gap = 1; | 
| kocemax | 7:cd3cafda3dd4 | 31 | int y = 0; | 
| kocemax | 7:cd3cafda3dd4 | 32 | |
| kocemax | 7:cd3cafda3dd4 | 33 | for (int j = 0; j < 15; ++j) { | 
| kocemax | 7:cd3cafda3dd4 | 34 | int x = 0; | 
| kocemax | 7:cd3cafda3dd4 | 35 | for (int i = 0; i < 14; ++i) { | 
| kocemax | 7:cd3cafda3dd4 | 36 | Brick b; | 
| kocemax | 7:cd3cafda3dd4 | 37 | b.x = x; | 
| kocemax | 7:cd3cafda3dd4 | 38 | b.y = y; | 
| kocemax | 7:cd3cafda3dd4 | 39 | b.w = w; | 
| kocemax | 7:cd3cafda3dd4 | 40 | b.h = h; | 
| kocemax | 7:cd3cafda3dd4 | 41 | map.addBrick(b); | 
| kocemax | 7:cd3cafda3dd4 | 42 | |
| kocemax | 7:cd3cafda3dd4 | 43 | x += w + gap; | 
| kocemax | 7:cd3cafda3dd4 | 44 | } | 
| kocemax | 7:cd3cafda3dd4 | 45 | y += h + gap; | 
| kocemax | 7:cd3cafda3dd4 | 46 | } | 
| kocemax | 7:cd3cafda3dd4 | 47 | } | 
| kocemax | 7:cd3cafda3dd4 | 48 | |
| kocemax | 5:12c179da4788 | 49 | |
| kocemax | 5:12c179da4788 | 50 | // Constructor | 
| kocemax | 5:12c179da4788 | 51 | Map::Map() | 
| kocemax | 5:12c179da4788 | 52 | { | 
| kocemax | 7:cd3cafda3dd4 | 53 | levels.push_back(new Level1()); | 
| kocemax | 7:cd3cafda3dd4 | 54 | levels.push_back(new Level2()); | 
| kocemax | 7:cd3cafda3dd4 | 55 | reset(); | 
| kocemax | 5:12c179da4788 | 56 | } | 
| kocemax | 5:12c179da4788 | 57 | |
| kocemax | 7:cd3cafda3dd4 | 58 | |
| kocemax | 5:12c179da4788 | 59 | // Destructor | 
| kocemax | 5:12c179da4788 | 60 | Map::~Map() | 
| kocemax | 5:12c179da4788 | 61 | { | 
| kocemax | 5:12c179da4788 | 62 | |
| kocemax | 5:12c179da4788 | 63 | } | 
| kocemax | 5:12c179da4788 | 64 | |
| kocemax | 6:39bda45efeed | 65 | void Map::initBricks() | 
| kocemax | 5:12c179da4788 | 66 | { | 
| kocemax | 7:cd3cafda3dd4 | 67 | bricks.clear(); | 
| kocemax | 7:cd3cafda3dd4 | 68 | |
| kocemax | 7:cd3cafda3dd4 | 69 | Level* level = levels[currentLevel]; | 
| kocemax | 7:cd3cafda3dd4 | 70 | level->initBricks(*this); | 
| kocemax | 6:39bda45efeed | 71 | } | 
| kocemax | 6:39bda45efeed | 72 | |
| kocemax | 7:cd3cafda3dd4 | 73 | void Map::drawMap(N5110 &lcd) | 
| kocemax | 7:cd3cafda3dd4 | 74 | { | 
| kocemax | 6:39bda45efeed | 75 | vector<Brick>::size_type end = bricks.size(); | 
| kocemax | 7:cd3cafda3dd4 | 76 | for (int i = 0; i < end; i++) { | 
| kocemax | 6:39bda45efeed | 77 | const Brick& b = bricks[i]; | 
| kocemax | 6:39bda45efeed | 78 | lcd.drawRect(b.x,b.y,b.w,b.h,FILL_BLACK); | 
| kocemax | 6:39bda45efeed | 79 | } | 
| kocemax | 6:39bda45efeed | 80 | } | 
| kocemax | 7:cd3cafda3dd4 | 81 | //See: https://stackoverflow.com/questions/31022269/collision-detection-between-two-rectangles-in-java | 
| kocemax | 7:cd3cafda3dd4 | 82 | bool rectIntersect( | 
| kocemax | 7:cd3cafda3dd4 | 83 | int Ax, int Ay, int Aw, int Ah, | 
| kocemax | 7:cd3cafda3dd4 | 84 | float Bx, float By, float Bw, float Bh) | 
| kocemax | 7:cd3cafda3dd4 | 85 | { | 
| kocemax | 7:cd3cafda3dd4 | 86 | return | 
| kocemax | 7:cd3cafda3dd4 | 87 | Bx + Bw > Ax && | 
| kocemax | 7:cd3cafda3dd4 | 88 | By + Bh > Ay && | 
| kocemax | 7:cd3cafda3dd4 | 89 | Ax + Aw > Bx && | 
| kocemax | 7:cd3cafda3dd4 | 90 | Ay + Ah > By; | 
| kocemax | 7:cd3cafda3dd4 | 91 | } | 
| kocemax | 6:39bda45efeed | 92 | |
| kocemax | 7:cd3cafda3dd4 | 93 | //Normals to each side of the rectangle | 
| kocemax | 7:cd3cafda3dd4 | 94 | const Vector2D Up = {0, -1}; | 
| kocemax | 7:cd3cafda3dd4 | 95 | const Vector2D Down = {0, 1}; | 
| kocemax | 7:cd3cafda3dd4 | 96 | const Vector2D Left = {-1, 0}; | 
| kocemax | 7:cd3cafda3dd4 | 97 | const Vector2D Right = {1, 0}; | 
| kocemax | 7:cd3cafda3dd4 | 98 | |
| kocemax | 7:cd3cafda3dd4 | 99 | //See: https://math.stackexchange.com/questions/13261/how-to-get-a-reflection-vector | 
| kocemax | 7:cd3cafda3dd4 | 100 | // r = d - 2(d dot n)n | 
| kocemax | 7:cd3cafda3dd4 | 101 | void reflect(Vector2D &d, const Vector2D &n) | 
| kocemax | 7:cd3cafda3dd4 | 102 | { | 
| kocemax | 7:cd3cafda3dd4 | 103 | float dotProd = d.x * n.x + d.y * n.y; | 
| kocemax | 7:cd3cafda3dd4 | 104 | float s = 2 * dotProd; | 
| kocemax | 7:cd3cafda3dd4 | 105 | |
| kocemax | 7:cd3cafda3dd4 | 106 | d.x = d.x - s * n.x; | 
| kocemax | 7:cd3cafda3dd4 | 107 | d.y = d.y - s * n.y; | 
| kocemax | 7:cd3cafda3dd4 | 108 | } | 
| kocemax | 7:cd3cafda3dd4 | 109 | |
| kocemax | 7:cd3cafda3dd4 | 110 | void Map::resolveCollision(const Brick &b, GameObject &obj) | 
| kocemax | 6:39bda45efeed | 111 | { | 
| kocemax | 7:cd3cafda3dd4 | 112 | // take velocity of the ball to determine direction and previous coords | 
| kocemax | 7:cd3cafda3dd4 | 113 | float vx = obj.getVelocity().x; | 
| kocemax | 7:cd3cafda3dd4 | 114 | float vy = obj.getVelocity().y; | 
| kocemax | 7:cd3cafda3dd4 | 115 | // take the previous x and y coords | 
| kocemax | 7:cd3cafda3dd4 | 116 | float x = obj.getPos().x - vx; | 
| kocemax | 7:cd3cafda3dd4 | 117 | float y = obj.getPos().y - vy; | 
| kocemax | 7:cd3cafda3dd4 | 118 | // sides of the bricks | 
| kocemax | 7:cd3cafda3dd4 | 119 | float leftX = b.x; | 
| kocemax | 7:cd3cafda3dd4 | 120 | float rightX = b.x + b.w; | 
| kocemax | 7:cd3cafda3dd4 | 121 | //float topY = b.y; | 
| kocemax | 7:cd3cafda3dd4 | 122 | //float bottomY = b.y + b.h; | 
| kocemax | 7:cd3cafda3dd4 | 123 | |
| kocemax | 7:cd3cafda3dd4 | 124 | // mid of x and y coords | 
| kocemax | 7:cd3cafda3dd4 | 125 | //float cx = b.x + b.w/2.0f; | 
| kocemax | 7:cd3cafda3dd4 | 126 | float cy = b.y + b.h/2.0f; | 
| kocemax | 7:cd3cafda3dd4 | 127 | |
| kocemax | 7:cd3cafda3dd4 | 128 | // distance between ball and rectangle center | 
| kocemax | 7:cd3cafda3dd4 | 129 | //float dx = x - cx; | 
| kocemax | 7:cd3cafda3dd4 | 130 | //float dy = y - cy; | 
| kocemax | 7:cd3cafda3dd4 | 131 | |
| kocemax | 7:cd3cafda3dd4 | 132 | Vector2D &vel = obj.getVelocity(); | 
| kocemax | 7:cd3cafda3dd4 | 133 | float thresh = 0.1; | 
| kocemax | 7:cd3cafda3dd4 | 134 | if (x > rightX - thresh) { | 
| kocemax | 7:cd3cafda3dd4 | 135 | // hit right | 
| kocemax | 7:cd3cafda3dd4 | 136 | reflect(vel, Right); | 
| kocemax | 7:cd3cafda3dd4 | 137 | } else if (x < leftX + thresh) { | 
| kocemax | 7:cd3cafda3dd4 | 138 | // hit left | 
| kocemax | 7:cd3cafda3dd4 | 139 | reflect(vel, Left); | 
| kocemax | 7:cd3cafda3dd4 | 140 | } else if (y < cy) { | 
| kocemax | 7:cd3cafda3dd4 | 141 | // hit top | 
| kocemax | 7:cd3cafda3dd4 | 142 | reflect(vel, Up); | 
| kocemax | 7:cd3cafda3dd4 | 143 | } else if (y > cy) { | 
| kocemax | 7:cd3cafda3dd4 | 144 | // hit bottom | 
| kocemax | 7:cd3cafda3dd4 | 145 | reflect(vel, Down); | 
| kocemax | 7:cd3cafda3dd4 | 146 | } else { | 
| kocemax | 7:cd3cafda3dd4 | 147 | if (vy > 0) { | 
| kocemax | 7:cd3cafda3dd4 | 148 | // hit top | 
| kocemax | 7:cd3cafda3dd4 | 149 | reflect(vel, Up); | 
| kocemax | 7:cd3cafda3dd4 | 150 | } else { | 
| kocemax | 7:cd3cafda3dd4 | 151 | // hit bottom | 
| kocemax | 7:cd3cafda3dd4 | 152 | reflect(vel, Down); | 
| kocemax | 7:cd3cafda3dd4 | 153 | } | 
| kocemax | 7:cd3cafda3dd4 | 154 | } | 
| kocemax | 6:39bda45efeed | 155 | } | 
| kocemax | 6:39bda45efeed | 156 | |
| kocemax | 6:39bda45efeed | 157 | void Map::checkCollision(GameObject &obj) | 
| kocemax | 6:39bda45efeed | 158 | { | 
| kocemax | 6:39bda45efeed | 159 | vector<Brick>::size_type end = bricks.size(); | 
| kocemax | 7:cd3cafda3dd4 | 160 | for (int i = 0; i < end; i++) { | 
| kocemax | 6:39bda45efeed | 161 | const Brick& b = bricks[i]; | 
| kocemax | 7:cd3cafda3dd4 | 162 | if (rectIntersect(b.x, b.y, b.w, b.h, | 
| kocemax | 7:cd3cafda3dd4 | 163 | obj.getPos().x, obj.getPos().y, obj.getW(), obj.getH())) { | 
| kocemax | 7:cd3cafda3dd4 | 164 | resolveCollision(b, obj); | 
| kocemax | 6:39bda45efeed | 165 | bricks.erase(bricks.begin() + i); | 
| kocemax | 6:39bda45efeed | 166 | break; | 
| kocemax | 5:12c179da4788 | 167 | } | 
| kocemax | 5:12c179da4788 | 168 | } | 
| kocemax | 5:12c179da4788 | 169 | } | 
| kocemax | 5:12c179da4788 | 170 | |
| kocemax | 7:cd3cafda3dd4 | 171 | bool Map::checkLevel() | 
| kocemax | 7:cd3cafda3dd4 | 172 | { | 
| kocemax | 7:cd3cafda3dd4 | 173 | if (bricks.size() == 0) { | 
| kocemax | 7:cd3cafda3dd4 | 174 | // cleared level | 
| kocemax | 7:cd3cafda3dd4 | 175 | ++currentLevel; | 
| kocemax | 7:cd3cafda3dd4 | 176 | printf("cleared level! %d %d\n", currentLevel, hasWon()); | 
| kocemax | 7:cd3cafda3dd4 | 177 | if (!hasWon()) { | 
| kocemax | 7:cd3cafda3dd4 | 178 | // initialize next level | 
| kocemax | 7:cd3cafda3dd4 | 179 | initBricks(); | 
| kocemax | 5:12c179da4788 | 180 | } | 
| kocemax | 7:cd3cafda3dd4 | 181 | return true; | 
| kocemax | 5:12c179da4788 | 182 | } | 
| kocemax | 7:cd3cafda3dd4 | 183 | return false; | 
| kocemax | 7:cd3cafda3dd4 | 184 | } | 
| kocemax | 7:cd3cafda3dd4 | 185 | |
| kocemax | 7:cd3cafda3dd4 | 186 | void Map::reset() | 
| kocemax | 7:cd3cafda3dd4 | 187 | { | 
| kocemax | 7:cd3cafda3dd4 | 188 | currentLevel = 0; | 
| kocemax | 7:cd3cafda3dd4 | 189 | initBricks(); | 
| kocemax | 5:12c179da4788 | 190 | } |