我目前正在使用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);
}
}
在开始渲染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();
}
现在,问题很明确:我的计划是将所有内容打包成单个Power-Of-Two纹理(价格合理的2048x2048),TiledMap
平铺集和对象表,所以我使用单个纹理,我可以最小化批量刷新到GPU。问题是我找不到使用外部TiledMap
加载SpriteRegion
的方法,甚至没有使用AtlasTmxTiledMapLoader
。
有人能指出我正确的方向吗?有没有办法加载TiledMap
传递TextureRegion
作为tileset,而不是创建一个新的,无法访问的Texture
,并且必须为地图刷新一次,然后再为其余的你的精灵?
答案 0 :(得分:0)
我还没有做到这一点,但你应该能够通过你的单一Power-Of-Two纹理图集来使用地图级别的属性' atlas'只要这些地区被命名为。
来自Javadoc ......
公共类AtlasTmxMapLoader扩展了BaseTmxMapLoader
TiledMap Loader从TextureAtlas加载tile而不是 单独的图像。它需要一个名为' atlas'的地图级属性。同 它的值是TextureAtlas的相对路径。地图集必须 拥有以地图中使用的tilesets命名的索引区域。 索引应该是tileset的本地(不是全局id)。跳闸 创建地图集时不应使用空格和旋转。