summaryrefslogtreecommitdiffstats
path: root/src/model
diff options
context:
space:
mode:
Diffstat (limited to 'src/model')
-rw-r--r--src/model/Map.cpp22
-rw-r--r--src/model/Map.hpp10
-rw-r--r--src/model/Position.hpp12
3 files changed, 26 insertions, 18 deletions
diff --git a/src/model/Map.cpp b/src/model/Map.cpp
index a5b5ee9..b7b40f5 100644
--- a/src/model/Map.cpp
+++ b/src/model/Map.cpp
@@ -31,20 +31,22 @@ namespace RPGEdit {
namespace Model {
-Position Map::getEntityPosition(const Entity *entity, uint64_t time) const {
+Position<float> Map::getEntityPosition(const Entity *entity, uint64_t time) const {
const EntityState &state = entityStates.at(entity);
+ Position<float> p(state.position);
+
if (state.transitionEnd)
if (time <= state.transitionStart)
- return state.position;
+ return p;
else if (time >= state.transitionEnd)
- return state.position + state.direction;
+ return p + state.direction;
else
- return state.position.translate(state.direction,
- float(time-state.transitionStart)/
- float(state.transitionEnd-state.transitionStart));
+ return p.translate(state.direction,
+ float(time-state.transitionStart)/
+ float(state.transitionEnd-state.transitionStart));
else
- return state.position;
+ return p;
}
bool Map::moveEntity(Entity *entity, Direction dir, uint64_t start, uint64_t end) {
@@ -55,7 +57,7 @@ bool Map::moveEntity(Entity *entity, Direction dir, uint64_t start, uint64_t end
entity->setDirection(dir);
- Position pos = state.position + dir;
+ Position<int> pos = state.position + dir;
if (getCollisionAt(pos.x, pos.y) == BLOCKED)
return false;
@@ -69,7 +71,7 @@ bool Map::moveEntity(Entity *entity, Direction dir, uint64_t start, uint64_t end
return true;
}
-void Map::moveEntityTo(Entity *entity, Position pos) {
+void Map::moveEntityTo(Entity *entity, Position<int> pos) {
EntityState &state = entityStates.at(entity);
setCollisionAt(state.position.x, state.position.y, EMPTY);
@@ -110,7 +112,7 @@ std::unique_ptr<Map> Map::load(__attribute__((unused)) const std::string &name)
}
}
- map->addEntity("square", Model::Position{6, 6});
+ map->addEntity("square", Model::Position<int>{6, 6});
return map;
}
diff --git a/src/model/Map.hpp b/src/model/Map.hpp
index c7b9783..4e434b1 100644
--- a/src/model/Map.hpp
+++ b/src/model/Map.hpp
@@ -58,13 +58,13 @@ protected:
class Map : private _Map {
private:
struct EntityState {
- Position position;
+ Position<int> position;
Direction direction;
uint64_t transitionStart = 0;
uint64_t transitionEnd = 0;
- EntityState(const Position &position0) : position(position0) {}
+ EntityState(const Position<int> &position0) : position(position0) {}
};
std::vector<std::unique_ptr<Entity>> entities;
@@ -123,7 +123,7 @@ public:
return entities;
}
- Entity * addEntity(const std::string &name, const Position &pos) {
+ Entity * addEntity(const std::string &name, const Position<int> &pos) {
Entity *e = new Entity(name);
pushEntity(e, EntityState(pos));
setCollisionAt(pos.x, pos.y, BLOCKED);
@@ -171,9 +171,9 @@ public:
return tiles[layer][y*width + x];
}
- Position getEntityPosition(const Entity *entity, uint64_t time) const;
+ Position<float> getEntityPosition(const Entity *entity, uint64_t time) const;
bool moveEntity(Entity *entity, Direction dir, uint64_t start, uint64_t end);
- void moveEntityTo(Entity *entity, Position pos);
+ void moveEntityTo(Entity *entity, Position<int> pos);
void finishEntityTransition(Entity *entity);
static std::unique_ptr<Map> load(const std::string &name);
diff --git a/src/model/Position.hpp b/src/model/Position.hpp
index 84044e6..a88c151 100644
--- a/src/model/Position.hpp
+++ b/src/model/Position.hpp
@@ -33,10 +33,11 @@ namespace RPGEdit {
namespace Model {
+template<typename T>
struct Position {
- float x, y;
+ T x, y;
- Position translate(Direction dir, float amount) const {
+ Position translate(Direction dir, T amount) const {
Position p = *this;
switch (dir) {
@@ -59,9 +60,14 @@ struct Position {
return p;
}
- Position operator+(Direction dir) const {
+ Position<T> operator+(Direction dir) const {
return translate(dir, 1);
}
+
+ template<typename T2>
+ explicit operator Position<T2>() const {
+ return Position<T2>{T2(x), T2(y)};
+ }
};
}