Để di chuyển Cameratrong TiledMapgiới hạn, OrthogonalTiledMapRendererđã được sử dụng.
Tôi cũng đã nhận thấy nó hoạt động bất ngờ: trong khi Camerađạt đến giới hạn bản đồ, bản đồ được lát gạch, giống như theo quán tính, di chuyển một số pixel quá xa (nó phụ thuộc vào tốc độ của thao tác vuốt).
Như một giải pháp , trên mỗi Camerachuyển động, Camerabuộc phải đưa vào giới hạn bản đồ. Xem putInMapBounds()phương pháp.
Để tránh sự cố trong TiledMapkết xuất, sử dụng Math.min(float, float).
Sử dụng trình nghe này để xử lý Camera:
/**
* @author Gram <gram7gram@gmail.com>
*/
public class CameraListener extends InputAdapter {
private final UIStage stage;
private final Camera camera;
private final Vector3 curr;
private final Vector3 last;
private final Vector3 delta;
private final int mapWidth;
private final int mapHeight;
public CameraListener(UIStage stage) {
this.stage = stage;
this.camera = stage.getViewport().getCamera();
curr = new Vector3();
last = new Vector3(-1, -1, -1);
delta = new Vector3();
TiledMapTileLayer layer = stage.getLevel().getMap().getFirstLayer();
mapWidth = layer.getWidth() * DDGame.TILE_HEIGHT;
mapHeight = layer.getHeight() * DDGame.TILE_HEIGHT;
}
@Override
public boolean touchDragged(int x, int y, int pointer) {
camera.unproject(curr.set(x, y, 0));
if (!(last.x == -1 && last.y == -1 && last.z == -1)) {
camera.unproject(delta.set(last.x, last.y, 0));
delta.sub(curr);
camera.translate(Math.min(delta.x, 5), Math.min(delta.y, 5), 0);
if (isInMapBounds()) {
stage.moveBy(Math.min(delta.x, 5), Math.min(delta.y, 5));
}
}
last.set(x, y, 0);
putInMapBounds();
return false;
}
private boolean isInMapBounds() {
return camera.position.x >= camera.viewportWidth / 2f
&& camera.position.x <= mapWidth - camera.viewportWidth / 2f
&& camera.position.y >= camera.viewportHeight / 2f
&& camera.position.y <= mapHeight - camera.viewportHeight / 2f;
}
private void putInMapBounds() {
if (camera.position.x < camera.viewportWidth / 2f)
camera.position.x = camera.viewportWidth / 2f;
else if (camera.position.x > mapWidth - camera.viewportWidth / 2f)
camera.position.x = mapWidth - camera.viewportWidth / 2f;
if (camera.position.y < camera.viewportHeight / 2f)
camera.position.y = camera.viewportHeight / 2f;
else if (camera.position.y > mapHeight - camera.viewportHeight / 2f)
camera.position.y = mapHeight - camera.viewportHeight / 2f;
stage.moveTo(
camera.position.x,
camera.position.y);
}
@Override
public boolean touchUp(int x, int y, int pointer, int button) {
last.set(-1, -1, -1);
Log.info("Camera at " + camera.position.x + ":" + camera.position.y);
return false;
}
}
setPosition()phương thức hay, điều đó sẽ khắc phục giới hạn, tôi vẫn trực tiếp đặt vị trí cam (ví dụcam.position.set()) Điều này hoạt động như một bùa mê! Cảm ơn đã giải thích!