我目前正在使用 LibGDX 开发游戏,我遇到了以下情况:
- 游戏
TiledMap
中的每个级别都使用地图。我创建了一个大图块集并将其打包成一个 ~1300x1300 PNG 文件(非 POT)。瓷砖是 128x128 + 排水沟。 场景是使用
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); } }
在开始渲染 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
,并且必须为地图刷新一次,然后再为其余的精灵刷新一次?