Don't move the viewport if it would generate gaps in the map.
In other words, don't let the player see past the end of the world.
This commit is contained in:
parent
5d231206ef
commit
4c105fc3df
3 changed files with 22 additions and 5 deletions
|
@ -69,6 +69,8 @@ namespace curry {
|
|||
#if !defined(NDEBUG)
|
||||
std::cout << "World size set to " << world_size << '\n';
|
||||
#endif
|
||||
|
||||
m_local_data->viewport.allow_overscan(false);
|
||||
}
|
||||
|
||||
void IngameScene::on_update (float parDeltaT) {
|
||||
|
@ -80,14 +82,16 @@ namespace curry {
|
|||
|
||||
auto& viewport = m_local_data->viewport;
|
||||
const float speed = parDeltaT * speed_per_sec;
|
||||
vec2f offset(0.0f);
|
||||
if (cloonel::IsPressed(input_bag(), ActionRight))
|
||||
viewport.set_position(viewport.position() + vec2f(speed, 0));
|
||||
offset.x() += speed;
|
||||
if (cloonel::IsPressed(input_bag(), ActionLeft))
|
||||
viewport.set_position(viewport.position() - vec2f(speed, 0));
|
||||
offset.x() -= speed;
|
||||
if (cloonel::IsPressed(input_bag(), ActionUp))
|
||||
viewport.set_position(viewport.position() - vec2f(0, speed));
|
||||
offset.y() -= speed;
|
||||
if (cloonel::IsPressed(input_bag(), ActionDown))
|
||||
viewport.set_position(viewport.position() + vec2f(0, speed));
|
||||
offset.y() += speed;
|
||||
viewport.set_position(viewport.position() + offset);
|
||||
|
||||
const auto tilesize(static_cast<vec2f>(world.tile_size()));
|
||||
const auto tilecount(m_local_data->worldtiles.width_height() / world.tile_size());
|
||||
|
|
|
@ -46,10 +46,21 @@ namespace curry {
|
|||
}
|
||||
|
||||
void WorldViewport::set_position (const vec2f& parPos) {
|
||||
m_position = parPos; //TODO: assert validity
|
||||
if (m_allow_overscan) {
|
||||
m_position = parPos;
|
||||
}
|
||||
else {
|
||||
const auto max_offs = vector_cast<vec2f>(world_size_pixel(*m_world)) - size();
|
||||
m_position.x() = std::min(std::max(parPos.x(), 0.0f), max_offs.x());
|
||||
m_position.y() = std::min(std::max(parPos.y(), 0.0f), max_offs.y());
|
||||
}
|
||||
}
|
||||
|
||||
const TileIndex* WorldViewport::tile (const vec2us& parIndex) const {
|
||||
return world()->tile(parIndex + starting_index(*this));
|
||||
}
|
||||
|
||||
void WorldViewport::allow_overscan (bool parAllow) {
|
||||
m_allow_overscan = parAllow;
|
||||
}
|
||||
} //namespace curry
|
||||
|
|
|
@ -16,6 +16,7 @@ namespace curry {
|
|||
const vec2f& position() const;
|
||||
const vec2f& size() const;
|
||||
const TileIndex* tile (const vec2us& parIndex) const;
|
||||
void allow_overscan (bool parAllow);
|
||||
|
||||
void set_position (const vec2f& parPos);
|
||||
|
||||
|
@ -26,5 +27,6 @@ namespace curry {
|
|||
vec2f m_position;
|
||||
vec2f m_size;
|
||||
WorldGrid* m_world;
|
||||
bool m_allow_overscan;
|
||||
};
|
||||
} //namespace curry
|
||||
|
|
Loading…
Reference in a new issue