[ad_1]
I used to be strugeling this for days find out how to implement tilemap into libgdx and box2d with infinite/limitless scheme. I can load a single map and show every thing on display screen. But putting 2 or extra tilemap aspect by aspect bought me headache. I do know presently not doable to offset/add x worth place of tilemap. What I do proper now’s use setview for digital camera of it is render methodology. This is my map helper and presently I works with 3 renderer for 3 tilemap as a check…
public class MapHelper {
personal Array<OrthogonalTiledMapRenderer> renderer = new Array<OrthogonalTiledMapRenderer>();
personal int quantity;
personal float oldDistance, currentDistance;
personal String layer = "world";
public MapHelper(Callback callback) {
this.callback = callback;
quantity = 0;
merchandise = new ItemMap[3];
}
public void render(CamHandler cam) {
for(int r = 0; r < renderer.dimension; r++) {
if(merchandise[r] != null) {
renderer.get(r).setView(cam.getCam().mixed, merchandise[r].distance, 0, merchandise[r].getWidth(), merchandise[r].getHeight());
renderer.get(r).render();
}
}
}
public void updateMap(CamHandler cam) {
if(mapOut(cam)) {
quantity++;
if(quantity > 2)
quantity = 0;
loadMap(quantity);
}
}
/**
* Check if digital camera attain the present distance, then construct new map
* @param cam
* @return
*/
personal boolean mapOut(CamHandler cam) {
float x = cam.getCam().place.x + cam.getCam().viewportWidth / 2;
Utils.log("pos cam x "+x+" present distance "+currentDistance);
return x >= currentDistance;
}
personal void loadMap(int map) {
AssetsManager.loadMap(map);
if(merchandise[map] != null) {
renderer.set(map, new OrthogonalTiledMapRenderer(AssetsManager.map));
merchandise[map].set(TileHelper.getMapWidth(AssetsManager.map, layer), TileHelper.getMapHeight(AssetsManager.map, layer), currentDistance);
} else {
renderer.add(new OrthogonalTiledMapRenderer(AssetsManager.map));
merchandise[map] = new ItemMap(TileHelper.getMapWidth(AssetsManager.map, layer), TileHelper.getMapHeight(AssetsManager.map, layer), currentDistance);
}
oldDistance = currentDistance;
currentDistance += TileHelper.getMapWidth(AssetsManager.map, layer);
callback.onLoad();
Utils.log("load new map "+map+" distance "+currentDistance);
}
public Array<OrthogonalTiledMapRenderer> getRenderer() {
return renderer;
}
public Array<Body> getBodies(World world) {
return new MapBodyBuilder().buildShapes(AssetsManager.map, world, oldDistance);
}
personal ItemMap[] merchandise;
personal class ItemMap {
personal float distance, mapWidth, mapHeight;
ItemMap(float w, float h, float distance) {
mapWidth = w;
mapHeight = h;
this.distance = distance;
}
personal void set(float mapWidth, float mapHeight, float distance) {
this.mapWidth = mapWidth;
this.mapHeight = mapHeight;
this.distance = distance;
}
personal float getWidth() {
return mapWidth * Constants.WORLD_TO_SCREEN;
}
personal float getHeight() {
return mapHeight * Constants.WORLD_TO_SCREEN;
}
}
personal Callback callback;
public interface Callback {
void onLoad();
}
public void startOver() {
clear();
currentDistance = quantity = 0;
loadMap(quantity);
}
personal void clear() {
for (OrthogonalTiledMapRenderer render : renderer) {
render.dispose();
}
}
}
With above class, I can show and cargo new map on display screen when digital camera reaching the map finish. But the tile layer texture retains fallacious place. Please give me an recommendation.
[ad_2]