Kostadin Chakarov / Mbed 2 deprecated el17kec

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }