Differentiate between int and float positions

This commit is contained in:
Matthias Schiffer 2014-09-25 23:33:50 +02:00
parent d82f3b7665
commit 8b4ca336ce
7 changed files with 31 additions and 23 deletions

View file

@ -35,7 +35,7 @@ MapContext::MapContext(EventBus *eventBus0, InputHandler *inputHandler0, const s
: eventBus(eventBus0), inputHandler(inputHandler0), map(map0) { : eventBus(eventBus0), inputHandler(inputHandler0), map(map0) {
view = std::unique_ptr<View::MapView>(new View::MapView(window, map.getTileset())); 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()); view->updateEntities(map.getEntities());

View file

@ -53,7 +53,7 @@ private:
void movePlayerContinue(uint64_t time); void movePlayerContinue(uint64_t time);
void keyPressed(uint16_t key, 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); return map.getEntityPosition(playerEntity, time);
} }

View file

@ -31,20 +31,22 @@ namespace RPGEdit {
namespace Model { 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); const EntityState &state = entityStates.at(entity);
Position<float> p(state.position);
if (state.transitionEnd) if (state.transitionEnd)
if (time <= state.transitionStart) if (time <= state.transitionStart)
return state.position; return p;
else if (time >= state.transitionEnd) else if (time >= state.transitionEnd)
return state.position + state.direction; return p + state.direction;
else else
return state.position.translate(state.direction, return p.translate(state.direction,
float(time-state.transitionStart)/ float(time-state.transitionStart)/
float(state.transitionEnd-state.transitionStart)); float(state.transitionEnd-state.transitionStart));
else else
return state.position; return p;
} }
bool Map::moveEntity(Entity *entity, Direction dir, uint64_t start, uint64_t end) { 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); entity->setDirection(dir);
Position pos = state.position + dir; Position<int> pos = state.position + dir;
if (getCollisionAt(pos.x, pos.y) == BLOCKED) if (getCollisionAt(pos.x, pos.y) == BLOCKED)
return false; return false;
@ -69,7 +71,7 @@ bool Map::moveEntity(Entity *entity, Direction dir, uint64_t start, uint64_t end
return true; return true;
} }
void Map::moveEntityTo(Entity *entity, Position pos) { void Map::moveEntityTo(Entity *entity, Position<int> pos) {
EntityState &state = entityStates.at(entity); EntityState &state = entityStates.at(entity);
setCollisionAt(state.position.x, state.position.y, EMPTY); 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; return map;
} }

View file

@ -58,13 +58,13 @@ protected:
class Map : private _Map { class Map : private _Map {
private: private:
struct EntityState { struct EntityState {
Position position; Position<int> position;
Direction direction; Direction direction;
uint64_t transitionStart = 0; uint64_t transitionStart = 0;
uint64_t transitionEnd = 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; std::vector<std::unique_ptr<Entity>> entities;
@ -123,7 +123,7 @@ public:
return entities; 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); Entity *e = new Entity(name);
pushEntity(e, EntityState(pos)); pushEntity(e, EntityState(pos));
setCollisionAt(pos.x, pos.y, BLOCKED); setCollisionAt(pos.x, pos.y, BLOCKED);
@ -171,9 +171,9 @@ public:
return tiles[layer][y*width + x]; 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); 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); void finishEntityTransition(Entity *entity);
static std::unique_ptr<Map> load(const std::string &name); static std::unique_ptr<Map> load(const std::string &name);

View file

@ -33,10 +33,11 @@ namespace RPGEdit {
namespace Model { namespace Model {
template<typename T>
struct Position { 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; Position p = *this;
switch (dir) { switch (dir) {
@ -59,9 +60,14 @@ struct Position {
return p; return p;
} }
Position operator+(Direction dir) const { Position<T> operator+(Direction dir) const {
return translate(dir, 1); return translate(dir, 1);
} }
template<typename T2>
explicit operator Position<T2>() const {
return Position<T2>{T2(x), T2(y)};
}
}; };
} }

View file

@ -94,7 +94,7 @@ void MapView::clearEntities() {
entitySprites.clear(); 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()); SDL_RenderClear(window->getRenderer());
std::pair<int, int> viewport = window->getViewport(); 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()) { 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(); Model::Direction dir = entity->getDirection();
SDL_Rect src = { SDL_Rect src = {

View file

@ -58,7 +58,7 @@ public:
void clear(); 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);
}; };
} }