【问题标题】:How to render only part of map and show only part of it?如何仅渲染地图的一部分并仅显示其中的一部分?
【发布时间】: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)。始终测试性能。

标签: libgdx tiled


【解决方案1】:

有多种方法可以做到这一点,但没有一种是完美优化的。几天前我试图这样做。我试过用:

  1. 精灵缓存;如果你有一张静态地图,这是最好的选择,不改变瓷砖。虽然我猜你的缓冲区有 5640 个瓷砖/纹理的限制。

  2. 使用 Scessior Stack 方法,这对我来说似乎很复杂,您可以简单地裁剪所需的纹理区域并将其显示为地图。但这不是一个好的解决方案。

  3. 我最好采用这种方法。我拿了两个 tmx 文件,一个是 large_map.tmx,其中包含所有详细的图块和图层;然后又取了另一个小的 small_map.tmx,它只包含 1/2 层,没有瓷砖。然后拿了两组加载器,渲染器,只需将小区域(2048X2048)中的需求单元格从大地图复制到小地图并仅渲染小地图。现在您可以使用此地图动态更改您的图块并显示动画,因为它只加载小的 tmx 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多