constexpr Color vboxColor(0xFA, 0xFA, 0x00);
constexpr Color hboxColor(0x00, 0xFA, 0x00);
- for (const Entity &e : world.Entities()) {
+ for (const Entity *e : world.Entities()) {
canvas.SetColor(boundsColor);
canvas.OutlineRect(
- cam.ToScreen(Vector<float>(e.bounds.Left(), e.bounds.Top())),
- cam.ToScale(Vector<float>(e.bounds.Size()))
+ cam.ToScreen(Vector<float>(e->bounds.Left(), e->bounds.Top())),
+ cam.ToScale(Vector<float>(e->bounds.Size()))
);
canvas.SetColor(vboxColor);
canvas.Line(
- cam.ToScreen(Vector<float>(e.vbox.Left(), e.vbox.Top())),
- cam.ToScreen(Vector<float>(e.vbox.Right(), e.vbox.Top())) - Vector<int>(1, 0)
+ cam.ToScreen(Vector<float>(e->vbox.Left(), e->vbox.Top())),
+ cam.ToScreen(Vector<float>(e->vbox.Right(), e->vbox.Top())) - Vector<int>(1, 0)
);
canvas.Line(
- cam.ToScreen(Vector<float>(e.vbox.Left(), e.vbox.Bottom())) - Vector<int>(0, 1),
- cam.ToScreen(Vector<float>(e.vbox.Right(), e.vbox.Bottom())) - Vector<int>(1, 1)
+ cam.ToScreen(Vector<float>(e->vbox.Left(), e->vbox.Bottom())) - Vector<int>(0, 1),
+ cam.ToScreen(Vector<float>(e->vbox.Right(), e->vbox.Bottom())) - Vector<int>(1, 1)
);
canvas.SetColor(hboxColor);
canvas.Line(
- cam.ToScreen(Vector<float>(e.hbox.Left(), e.hbox.Top())),
- cam.ToScreen(Vector<float>(e.hbox.Left(), e.hbox.Bottom())) - Vector<int>(0, 1)
+ cam.ToScreen(Vector<float>(e->hbox.Left(), e->hbox.Top())),
+ cam.ToScreen(Vector<float>(e->hbox.Left(), e->hbox.Bottom())) - Vector<int>(0, 1)
);
canvas.Line(
- cam.ToScreen(Vector<float>(e.hbox.Right(), e.hbox.Top())) - Vector<int>(1, 0),
- cam.ToScreen(Vector<float>(e.hbox.Right(), e.hbox.Bottom())) - Vector<int>(1, 1)
+ cam.ToScreen(Vector<float>(e->hbox.Right(), e->hbox.Top())) - Vector<int>(1, 0),
+ cam.ToScreen(Vector<float>(e->hbox.Right(), e->hbox.Bottom())) - Vector<int>(1, 1)
);
}
}
e.vbox = AABB(.1, 0, 1.8, 3);
e.hbox = AABB(0, .1, 2, 1.8);
e.Move(Vector<float>(5, 0));
- Entity &player = world.AddEntity(e);
+ world.AddEntity(e);
Entity mob;
mob.bounds = AABB(0, 0, 2, 1.5);
world.AddEntity(mob);
Application app(canv, world, tiles);
- app.Control(player);
+ app.Control(e);
app.Run();
return 0;
#include "World.h"
#include "Collision.h"
+#include "Entity.h"
#include "../graphics/const.h"
#include <algorithm>
void World::Update(float dt) {
- for (Entity &e : entities) {
- if (e.onGround) {
- e.Update(dt, Vector<float>(), 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);
+ e->Update(dt, gravity, terminal);
}
- BoundsCollision(e, dt);
- TileCollision(e, dt);
+ BoundsCollision(*e, dt);
+ TileCollision(*e, dt);
}
}
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
}
}
}
-Entity &World::AddEntity(const Entity &e) {
- entities.emplace_back(e);
- return entities.back();
-}
-
}
#ifndef ORBI_WORLD_H_
#define ORBI_WORLD_H_
-#include "AABB.h"
-#include "Entity.h"
#include "Tile.h"
#include "../graphics/Vector.h"
namespace orbi {
+class Entity;
+
class World {
public:
const Tile &TileAt(Vector<int> pos) const { return tiles[Index(pos)]; }
void SetTile(Vector<int> pos, const Tile &t) { tiles[Index(pos)] = t; }
- const std::list<Entity> &Entities() const { return entities; }
- Entity &AddEntity(const Entity &);
+ const std::list<Entity *> &Entities() const { return entities; }
+ void AddEntity(Entity &e) { entities.push_back(&e); }
private:
void BoundsCollision(Entity &, float dt);
std::vector<Tile> tiles;
- std::list<Entity> entities;
-
- mutable AABB tileShape;
+ std::list<Entity *> entities;
};