LibGDX - 从一个大的TextureRegion

时间:2015-06-11 20:03:38

标签: java opengl libgdx tiled texturepacker

我目前正在使用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. 在开始渲染tilesMap之前,我绘制了其他几个对象(敌人,物品,活动元素)。这必须是这种方式,因为地图的所有单元格上都没有切片,我希望这些对象隐藏在某些切片下。所有这些对象共享相同的摄像机投影,因此当我想渲染这些对象时,我启动SpriteBatch,并在启动地图渲染器时将其保持打开状态。所有这些对象当前都被打包成大小约为1000x1000的纹理,但它由许多小对象组成,因此它们可以包裹在tileset的区域周围(如下所示)。事情就是这样:

    @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();
     }
    
  4. 现在,问题很明确:我的计划是将所有内容打包成单个Power-Of-Two纹理(价格合理的2048x2048),TiledMap平铺集和对象表,所以我使用单个纹理,我可以最小化批量刷新到GPU。问题是我找不到使用外部TiledMap加载SpriteRegion的方法,甚至没有使用AtlasTmxTiledMapLoader

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

1 个答案:

答案 0 :(得分:0)

我还没有做到这一点,但你应该能够通过你的单一Power-Of-Two纹理图集来使用地图级别的属性' atlas'只要这些地区被命名为。

来自Javadoc ......

  

公共类AtlasTmxMapLoader扩展了BaseTmxMapLoader      

TiledMap Loader从TextureAtlas加载tile而不是   单独的图像。它需要一个名为' atlas'的地图级属性。同   它的值是TextureAtlas的相对路径。地图集必须   拥有以地图中使用的tilesets命名的索引区域。   索引应该是tileset的本地(不是全局id)。跳闸   创建地图集时不应使用空格和旋转。