summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2014-09-25 23:33:50 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2014-09-25 23:33:50 +0200
commit8b4ca336ce68cc17573115dd07eb1bfc6521b298 (patch)
treeb0a6a457986da0a744c1394cc3788443a50ecaa8
parentd82f3b7665435abefe84c8dbc16483acd235b478 (diff)
downloadrpgedit-8b4ca336ce68cc17573115dd07eb1bfc6521b298.tar
rpgedit-8b4ca336ce68cc17573115dd07eb1bfc6521b298.zip
Differentiate between int and float positions
-rw-r--r--src/control/MapContext.cpp2
-rw-r--r--src/control/MapContext.hpp2
-rw-r--r--src/model/Map.cpp22
-rw-r--r--src/model/Map.hpp10
-rw-r--r--src/model/Position.hpp12
-rw-r--r--src/view/MapView.cpp4
-rw-r--r--src/view/MapView.hpp2
7 files changed, 31 insertions, 23 deletions
diff --git a/src/control/MapContext.cpp b/src/control/MapContext.cpp
index 8900298..aa246a9 100644
--- a/src/control/MapContext.cpp
+++ b/src/control/MapContext.cpp
@@ -35,7 +35,7 @@ MapContext::MapContext(EventBus *eventBus0, InputHandler *inputHandler0, const s
: eventBus(eventBus0), inputHandler(inputHandler0), map(map0) {
view = std::unique_ptr<View::MapView>(new View::MapView(window, map.getTileset()));
- playerEntity = map.addEntity("square", Model::Position{8, 8});
+ playerEntity = map.addEntity("square", Model::Position<int>{8, 8});
view->updateEntities(map.getEntities());
diff --git a/src/control/MapContext.hpp b/src/control/MapContext.hpp
index d9c34f3..05ed991 100644
--- a/src/control/MapContext.hpp
+++ b/src/control/MapContext.hpp
@@ -53,7 +53,7 @@ private:
void movePlayerContinue(uint64_t time);
void keyPressed(uint16_t key, uint64_t time);
- Model::Position getViewPosition(uint64_t time) {
+ Model::Position<float> getViewPosition(uint64_t time) {
return map.getEntityPosition(playerEntity, time);
}
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)};
+ }
};
}
diff --git a/src/view/MapView.cpp b/src/view/MapView.cpp
index 4a6e552..287fc87 100644
--- a/src/view/MapView.cpp
+++ b/src/view/MapView.cpp
@@ -94,7 +94,7 @@ void MapView::clearEntities() {
entitySprites.clear();
}
-void MapView::render(const Model::Map *map, Model::Position center, uint64_t time) {
+void MapView::render(const Model::Map *map, Model::Position<float> center, uint64_t time) {
SDL_RenderClear(window->getRenderer());
std::pair<int, int> viewport = window->getViewport();
@@ -137,7 +137,7 @@ void MapView::render(const Model::Map *map, Model::Position center, uint64_t tim
}
for (auto &entity : map->getEntities()) {
- Model::Position pos = map->getEntityPosition(entity.get(), time);
+ Model::Position<float> pos = map->getEntityPosition(entity.get(), time);
Model::Direction dir = entity->getDirection();
SDL_Rect src = {
diff --git a/src/view/MapView.hpp b/src/view/MapView.hpp
index e813950..9a27328 100644
--- a/src/view/MapView.hpp
+++ b/src/view/MapView.hpp
@@ -58,7 +58,7 @@ public:
void clear();
- void render(const Model::Map *map, Model::Position center, uint64_t time);
+ void render(const Model::Map *map, Model::Position<float> center, uint64_t time);
};
}