【发布时间】:2015-12-07 14:01:13
【问题描述】:
我的地图大小为 40000X20000,我只想渲染 2048X2048 并在屏幕上只显示 1200X600 像素,我该怎么做?
换句话说,认为我有大地图,我不想渲染所有 40000X20000 我只想渲染较小的地图 2048X2048
我的屏幕允许我显示 1200X600 像素。
我的代码:
public class LibgdxGame extends ApplicationAdapter {
static final float WORLD_WIDTH = 40000.0f;
static final float WORLD_HEIGHT = 20000.0f;
// Define viewoport
private static final float VIRTUAL_WIDTH = 1200.0f;
private static final float VIRTUAL_HEIGHT = 600.0f;
// Move camera around
private static final float CAMERA_SPEED = 60.0f;
private OrthographicCamera camera;
private Viewport viewport;
private TiledMap map;
private TmxMapLoader loader;
private OrthogonalTiledMapRenderer renderer;
private Vector2 direction;
@Override
public void create () {
camera = new OrthographicCamera(15000, 15000);
viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);
camera.position.set(10900, 10800, 0);
loader = new TmxMapLoader();//
map = loader.load("40000X20000.tmx");
renderer = new OrthogonalTiledMapRenderer(map);
direction = new Vector2();
}
@Override
public void dispose() {
map.dispose();
renderer.dispose();
}
@Override
public void render () {
System.out.println("Render.........");
Gdx.gl.glClearColor(0.8f, 0.8f, 0.8f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
updateCamera();
renderer.setView(camera);
renderer.render();
}
@Override
public void resize(int width, int height) {
viewport.update(width, height);
System.out.println(width);
System.out.println(height);
}
private void updateCamera() {
direction.set(0.0f, 0.0f);
int mouseX = Gdx.input.getX();
int mouseY = Gdx.input.getY();
int width = Gdx.graphics.getWidth();
int height = Gdx.graphics.getHeight();
if (Gdx.input.isKeyPressed(Keys.LEFT) || (Gdx.input.isTouched() && mouseX < width * 0.25f)) {
direction.x = -1;
}
else if (Gdx.input.isKeyPressed(Keys.RIGHT) || (Gdx.input.isTouched() && mouseX > width * 0.25f)) {
direction.x = 1;
}
if (Gdx.input.isKeyPressed(Keys.UP) || (Gdx.input.isTouched() && mouseY < height * 0.25f)) {
direction.y = 1;
}
else if (Gdx.input.isKeyPressed(Keys.DOWN) || (Gdx.input.isTouched() && mouseY > height * 0.25f)) {
direction.y = -1;
}
direction.nor().scl(CAMERA_SPEED * Gdx.graphics.getDeltaTime());;
camera.position.x += direction.x;
camera.position.y += direction.y;
TiledMapTileLayer layer = (TiledMapTileLayer)map.getLayers().get(0);
float cameraMinX = viewport.getWorldWidth() * 0.5f;
float cameraMinY = viewport.getWorldHeight() * 0.5f;
float cameraMaxX = layer.getWidth() * layer.getTileWidth() - cameraMinX;
float cameraMaxY = layer.getHeight() * layer.getTileHeight() - cameraMinY;
camera.position.x = MathUtils.clamp(camera.position.x, cameraMinX, cameraMaxX);
camera.position.y= MathUtils.clamp(camera.position.y, cameraMinY, cameraMaxY);
camera.update();
}
}
【问题讨论】:
-
我认为平铺地图渲染器已经自动渲染了足够的平铺以覆盖可见区域。如果远大于相机的视野,则不确定您要渲染 2048x2048 是什么意思。
-
@Tenfour04 是对的。您不需要 scessior 等。根据视口,tiledmaprender 只会渲染需要的部分,并且这样做非常有效。但仍然尽量避免在视图中有大量的瓷砖。增加图块大小(例如,将 4 组合为 1)。始终测试性能。