void World::BoundsCollision(Entity &e, float dt) {
if (e.vbox.Top() < 0) {
e.Move(Vector<float>(0, -e.vbox.Top()));
- e.vel.y = 0;
+ if (e.vel.y < 0) {
+ e.vel.y = 0;
+ }
}
if (e.vbox.Bottom() > size.y) {
e.Move(Vector<float>(0, size.y - e.vbox.Bottom()));
- e.vel.y = 0;
+ if (e.vel.y > 0) {
+ e.vel.y = 0;
+ }
e.onGround = true;
}
if (e.hbox.Right() > size.x) {
e.Move(Vector<float>(size.x - e.hbox.Right(), 0));
- e.vel.x = 0;
+ if (e.vel.x > 0) {
+ e.vel.x = 0;
+ }
}
if (e.hbox.Left() < 0) {
e.Move(Vector<float>(-e.hbox.Left(), 0));
- e.vel.x = 0;
+ if (e.vel.x < 0) {
+ e.vel.x = 0;
+ }
}
}
const Tile &tile = TileAt(Vector<int>(x, y));
if (tile.IsSolid()) {
response.y = y + 1 - e.vbox.Top();
- e.vel.y = 0;
+ if (e.vel.y < 0) {
+ e.vel.y = 0;
+ }
break;
}
}
if (tile.IsSolid()) {
response.y = y - e.vbox.Bottom();
e.onGround = true;
- e.vel.y = 0;
+ if (e.vel.y > 0) {
+ e.vel.y = 0;
+ }
break;
}
}
if (tile.IsSolid()) {
response.y = -1;
e.onGround = true;
- e.vel.y = 0;
+ if (e.vel.y > 0) {
+ e.vel.y = 0;
+ }
break;
}
}
const Tile &tile = TileAt(Vector<int>(x, y));
if (tile.IsSolid()) {
response.x = x + 1 - e.hbox.Left();
- e.vel.x = 0;
+ if (e.vel.x < 0) {
+ e.vel.x = 0;
+ }
break;
}
}
const Tile &tile = TileAt(Vector<int>(x, y));
if (tile.IsSolid()) {
response.x = x - e.hbox.Right();
- e.vel.x = 0;
+ if (e.vel.x > 0) {
+ e.vel.x = 0;
+ }
break;
}
}