#include "World.h"
#include "Collision.h"
+#include "Entity.h"
#include "../graphics/const.h"
#include <algorithm>
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<float>(), terminal);
+ e->onGround = false;
+ } else {
+ e->Update(dt, gravity, terminal);
+ }
- BoundsCollision(e, dt);
- TileCollision(e, dt);
+ BoundsCollision(*e, dt);
+ TileCollision(*e, dt);
}
}
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;
}
}
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
}
}
}
-const AABB &World::TileShapeAt(Vector<int> pos) const {
- tileShape = AABB(pos, Vector<float>(1, 1));
- return tileShape;
-}
-
-
-Entity &World::AddEntity(const Entity &e) {
- entities.emplace_back(e);
- return entities.back();
-}
-
}