我目前正在使用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的纹理,但是它由许多小对象组成,因此可以将它们包裹在tileet的区域周围(请参阅下文)。事情就这样了:@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
,并且必须一次刷新地图,然后再次刷新其余的sprite? 最佳答案
我还没有做到这一点,但是您应该能够将单个“二次幂”纹理图集传递给使用地图级属性“图集”,只要区域的名称正确。
从Javadoc ...
公共类AtlasTmxMapLoader扩展BaseTmxMapLoader
一个TiledMap加载器,它从TextureAtlas加载而不是从Tile加载
单独的图像。它需要一个带有“ atlas”的地图级属性,
其值是TextureAtlas的相对路径。地图集必须
其中包含以地图中使用的图块集命名的索引区域。
索引应位于图块集的本地(而不是全局ID)。跳闸
创建图集时,不应使用空格和旋转。