4 #include "../graphics/const.h"
12 World::World(Vector<int> size)
14 , count(size.x * size.y)
23 void World::Update(float dt) {
24 for (Entity &e : entities) {
25 e.Update(dt, gravity, terminal);
28 BoundsCollision(e, dt);
34 void World::BoundsCollision(Entity &e, float dt) {
35 if (e.vbox.Top() < 0) {
36 e.Move(Vector<float>(0, -e.vbox.Top()));
39 if (e.vbox.Bottom() > size.y) {
40 e.Move(Vector<float>(0, size.y - e.vbox.Bottom()));
44 if (e.hbox.Right() > size.x) {
45 e.Move(Vector<float>(size.x - e.hbox.Right(), 0));
48 if (e.hbox.Left() < 0) {
49 e.Move(Vector<float>(-e.hbox.Left(), 0));
54 void World::TileCollision(Entity &e, float dt) {
55 Vector<float> response;
58 for (int x = e.vbox.Left(), y = e.vbox.Top(),
59 end = std::ceil(e.vbox.Right()); x < end; ++x) {
60 const Tile &tile = TileAt(Vector<int>(x, y));
62 response.y = y + 1 - e.vbox.Top();
69 for (int x = e.vbox.Left(), y = e.vbox.Bottom(),
70 end = std::ceil(e.vbox.Right()); x < end; ++x) {
71 const Tile &tile = TileAt(Vector<int>(x, y));
73 response.y = y - e.vbox.Bottom();
79 if (response.y <= 0) {
81 // due to the hbox's huge bottom gap
82 for (int x = e.vbox.Left(), y = e.vbox.Bottom() - 1,
83 end = std::ceil(e.vbox.Right()); x < end; ++x) {
84 const Tile &tile = TileAt(Vector<int>(x, y));
95 for (int y = e.hbox.Top(), x = e.hbox.Left(),
96 end = std::ceil(e.hbox.Bottom()); y < end; ++y) {
97 const Tile &tile = TileAt(Vector<int>(x, y));
99 response.x = x + 1 - e.hbox.Left();
106 for (int y = e.hbox.Top(), x = e.hbox.Right(),
107 end = std::ceil(e.hbox.Bottom()); y < end; ++y) {
108 const Tile &tile = TileAt(Vector<int>(x, y));
109 if (tile.IsSolid()) {
110 response.x = x - e.hbox.Right();
116 if (response.x > fixSpeed * dt) {
117 response.x = fixSpeed * dt;
118 } else if (response.x < -fixSpeed * dt) {
119 response.x = -fixSpeed * dt;
121 if (response.y > fixSpeed * dt) {
122 response.y = fixSpeed * dt;
123 } else if (response.y < -fixSpeed * dt) {
124 response.y = -fixSpeed * dt;
130 const AABB &World::TileShapeAt(Vector<int> pos) const {
131 tileShape = AABB(pos, Vector<float>(1, 1));
136 Entity &World::AddEntity(const Entity &e) {
137 entities.emplace_back(e);
138 return entities.back();