- const Vector<int> cBegin(b.Left(), b.Top());
- const Vector<int> cEnd(b.Right() + 1, b.Bottom() + 1);
-
- Vector<float> min;
- Vector<float> max;
-
- for (Vector<int> pos(cBegin); pos.y < cEnd.y; ++pos.y) {
- for (pos.x = cBegin.x; pos.x < cEnd.x; ++pos.x) {
- if (!TileAt(pos).IsSolid()) continue;
- const AABB &tBounds = TileShapeAt(pos);
- Collision coll;
- if (!e.bounds.Intersects(tBounds, coll)) {
- continue;
- }
- if (coll.depth.x < min.x) min.x = coll.depth.x;
- if (coll.depth.x > max.x) max.x = coll.depth.x;
- if (coll.depth.y < min.y) min.y = coll.depth.y;
- if (coll.depth.y > max.y) max.y = coll.depth.y;
+void World::TileCollision(Entity &e, float dt) {
+ Vector<float> response;
+
+ // top
+ for (int x = e.vbox.Left(), y = e.vbox.Top(),
+ end = std::ceil(e.vbox.Right()); x < end; ++x) {
+ const Tile &tile = TileAt(Vector<int>(x, y));
+ if (tile.IsSolid()) {
+ response.y = y + 1 - e.vbox.Top();
+ if (e.vel.y < 0) {
+ e.vel.y = 0;