X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FWorld.cpp;h=a198ccc77a2f06b17ea49c6b4806f392f3d6448a;hb=HEAD;hp=aa17319cd8dfca6cd9e91d1fcddd7b66ce0e064c;hpb=03b142b877e19a2355e1a79e279e024922d44655;p=orbi.git diff --git a/src/world/World.cpp b/src/world/World.cpp index aa17319..a198ccc 100644 --- a/src/world/World.cpp +++ b/src/world/World.cpp @@ -1,6 +1,7 @@ #include "World.h" #include "Collision.h" +#include "Entity.h" #include "../graphics/const.h" #include @@ -23,12 +24,16 @@ World::World(Vector size) void World::Update(float dt) { - for (Entity &e : entities) { - e.Update(dt, gravity, terminal); - e.onGround = false; + for (Entity *e : entities) { + if (e->onGround) { + e->Update(dt, Vector(), terminal); + e->onGround = false; + } else { + e->Update(dt, gravity, terminal); + } - BoundsCollision(e, dt); - TileCollision(e, dt); + BoundsCollision(*e, dt); + TileCollision(*e, dt); } } @@ -36,20 +41,28 @@ void World::Update(float dt) { void World::BoundsCollision(Entity &e, float dt) { if (e.vbox.Top() < 0) { e.Move(Vector(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(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(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(-e.hbox.Left(), 0)); - e.vel.x = 0; + if (e.vel.x < 0) { + e.vel.x = 0; + } } } @@ -62,7 +75,9 @@ void World::TileCollision(Entity &e, float dt) { const Tile &tile = TileAt(Vector(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; } } @@ -74,7 +89,9 @@ void World::TileCollision(Entity &e, float dt) { 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; } } @@ -87,7 +104,9 @@ void World::TileCollision(Entity &e, float dt) { if (tile.IsSolid()) { response.y = -1; e.onGround = true; - e.vel.y = 0; + if (e.vel.y > 0) { + e.vel.y = 0; + } break; } } @@ -99,7 +118,9 @@ void World::TileCollision(Entity &e, float dt) { const Tile &tile = TileAt(Vector(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; } } @@ -110,7 +131,9 @@ void World::TileCollision(Entity &e, float dt) { const Tile &tile = TileAt(Vector(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; } } @@ -137,7 +160,7 @@ void World::EntityCollision() { auto second(first); ++second; for (auto secondEnd(entities.end()); second != secondEnd; ++second) { - if (first->bounds.Intersects(second->bounds)) { + if ((*first)->bounds.Intersects((*second)->bounds)) { // damage + knockback } } @@ -145,15 +168,4 @@ void World::EntityCollision() { } -const AABB &World::TileShapeAt(Vector pos) const { - tileShape = AABB(pos, Vector(1, 1)); - return tileShape; -} - - -Entity &World::AddEntity(const Entity &e) { - entities.emplace_back(e); - return entities.back(); -} - }