1

我目前正在使用 LibGDX 开发游戏,我遇到了以下情况:

  1. 游戏TiledMap中的每个级别都使用地图。我创建了一个大图块集并将其打包成一个 ~1300x1300 PNG 文件(非 POT)。瓷砖是 128x128 + 排水沟。
  2. 场景是使用OrthogonalTiledMapRenderer. 实际上它是对内置的稍微修改OrthogonalTiledMapRenderer,它没有将相机投影设置为SpriteBatch渲染器,导致每个循环额外刷新:

    private class OrthogonalTiledMapRenderer2 extends OrthogonalTiledMapRenderer {
        public OrthogonalTiledMapRenderer2 (TiledMap map, float unitScale, Batch batch) {
            super(map, unitScale, batch);
        }
    
        @Override
        public void setView (OrthographicCamera camera) {
            //batch.setProjectionMatrix(camera.combined); //This causes an unneeded flush in my case: the projection matrix is already set.
            float width = camera.viewportWidth * camera.zoom;
            float height = camera.viewportHeight * camera.zoom;
            viewBounds.set(camera.position.x - width / 2, camera.position.y - height / 2, width, height);
        }
    }
    
  3. 在开始渲染 tiledMap 之前,我绘制了其他几个对象(敌人、物品、活动元素)。必须这样,因为地图的所有单元格上都没有瓷砖,我希望这些对象隐藏在一些瓷砖下。所有这些对象共享相同的相机投影,因此我SpriteBatch在要渲染这些对象时启动,并在启动地图渲染器时将其保持打开状态。所有这些对象目前都被打包成一个大小约为 1000x1000 的纹理,但它由许多小对象组成,因此它们可以包裹在瓦片集的区域周围(阅读下文)。事情是这样的:

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        for (Thing t : things) {
            t.draw(batch);
        }
        orthogonalTiledMapRenderer2.setView(camera);
        orthogonalTiledMapRenderer2.render(tileLayer); //Uses the same batch
        //...
         batch.end();
     }
    

现在,事情很清楚了:我的计划是将所有内容打包成一个二次幂纹理(到可承受的 2048x2048 大小),包括TiledMap瓦片集和对象表,所以我使用单个纹理,我可以最小化批量刷新到 GPU。问题是我找不到TiledMap使用外部加载 a 的方法SpriteRegion,甚至没有使用AtlasTmxTiledMapLoader.

谁能指出我正确的方向?有没有办法将TiledMap传递的 aTextureRegion作为图块集加载,而不是创建一个新的、无法访问的Texture,并且必须为地图刷新一次,然后再为其余的精灵刷新一次?

4

1 回答 1

1

我还没有这样做,但是只要这些区域被适当地命名,您应该能够将您的单个二次幂纹理图集传递给使用贴图级属性“图集”。

从Javadoc...

公共类 AtlasTmxMapLoader 扩展 BaseTmxMapLoader

一个 TiledMap 加载器,它从 TextureAtlas 加载瓦片而不是单独的图像。它需要一个名为“atlas”的地图级属性,其值是 TextureAtlas 的相对路径。地图集必须包含以地图中使用的瓦片集命名的索引区域。索引应该是瓦片集的本地(而不是全局 id)。创建图集时不应使用剥离空白和旋转。

于 2015-06-11T20:22:47.923 回答