4 #include "../graphics/const.h"
14 World::World(Vector<int> size)
16 , count(size.x * size.y)
25 void World::Update(float dt) {
26 for (Entity &e : entities) {
27 e.Update(dt, gravity, terminal);
30 BoundsCollision(e, dt);
36 void World::BoundsCollision(Entity &e, float dt) {
37 if (e.vbox.Top() < 0) {
38 e.Move(Vector<float>(0, -e.vbox.Top()));
41 if (e.vbox.Bottom() > size.y) {
42 e.Move(Vector<float>(0, size.y - e.vbox.Bottom()));
46 if (e.hbox.Right() > size.x) {
47 e.Move(Vector<float>(size.x - e.hbox.Right(), 0));
50 if (e.hbox.Left() < 0) {
51 e.Move(Vector<float>(-e.hbox.Left(), 0));
56 void World::TileCollision(Entity &e, float dt) {
57 Vector<float> response;
60 for (int x = e.vbox.Left(), y = e.vbox.Top(),
61 end = std::ceil(e.vbox.Right()); x < end; ++x) {
62 const Tile &tile = TileAt(Vector<int>(x, y));
64 response.y = y + 1 - e.vbox.Top();
71 for (int x = e.vbox.Left(), y = e.vbox.Bottom(),
72 end = std::ceil(e.vbox.Right()); x < end; ++x) {
73 const Tile &tile = TileAt(Vector<int>(x, y));
75 response.y = y - e.vbox.Bottom();
81 if (response.y <= 0) {
83 // due to the hbox's huge bottom gap
84 for (int x = e.vbox.Left(), y = e.vbox.Bottom() - 1,
85 end = std::ceil(e.vbox.Right()); x < end; ++x) {
86 const Tile &tile = TileAt(Vector<int>(x, y));
97 for (int y = e.hbox.Top(), x = e.hbox.Left(),
98 end = std::ceil(e.hbox.Bottom()); y < end; ++y) {
99 const Tile &tile = TileAt(Vector<int>(x, y));
100 if (tile.IsSolid()) {
101 response.x = x + 1 - e.hbox.Left();
108 for (int y = e.hbox.Top(), x = e.hbox.Right(),
109 end = std::ceil(e.hbox.Bottom()); y < end; ++y) {
110 const Tile &tile = TileAt(Vector<int>(x, y));
111 if (tile.IsSolid()) {
112 response.x = x - e.hbox.Right();
118 if (response.x > fixSpeed * dt) {
119 response.x = fixSpeed * dt;
120 } else if (response.x < -fixSpeed * dt) {
121 response.x = -fixSpeed * dt;
123 if (response.y > fixSpeed * dt) {
124 response.y = fixSpeed * dt;
125 } else if (response.y < -fixSpeed * dt) {
126 response.y = -fixSpeed * dt;
131 void World::EntityCollision() {
132 if (entities.size() <= 1) return;
134 auto firstEnd(entities.end());
136 for (auto first(entities.begin()); first != firstEnd; ++first) {
139 for (auto secondEnd(entities.end()); second != secondEnd; ++second) {
140 if (first->bounds.Intersects(second->bounds)) {
141 // damage + knockback
148 const AABB &World::TileShapeAt(Vector<int> pos) const {
149 tileShape = AABB(pos, Vector<float>(1, 1));
154 Entity &World::AddEntity(const Entity &e) {
155 entities.emplace_back(e);
156 return entities.back();