我使用Libgdx渲染TileMap作为我游戏的背景。我稍后可能会渲染一些不同的图层。 如果没有tilemap渲染和单个背景图片,它可以正常工作! 当我使用TiledRender时,会发生一些奇怪的事情:
两个白色区域通常是触控板和角色。
触摸板和角色使用以下方式呈现:
@Override
public void draw(SpriteBatch batch, float parentAlpha) {
sprite.draw(batch);
}
我在我的TileMap渲染中的地图如下所示:
public class Map extends Actor {
private TiledMap map;
private OrthogonalTiledMapRenderer render;
public int[][] mapArray = new int[Config.X_SIZE][Config.Y_SIZE];
public Map(TiledMap map){
this.map = map;
this.render = new OrthogonalTiledMapRenderer(map,(((float)Config.VIRTUAL_VIEW_HEIGHT/Config.Y_SIZE)/(float)Config.TILE_SIZE));
this.toBack();
}
@Override
public void draw(SpriteBatch batch, float parentAlpha) {
this.render.setView((OrthographicCamera) this.getStage().getCamera());
render.render();
}
}
修复SpriteBatch问题的任何消息?
答案 0 :(得分:6)
许多Libgdx呈现辅助对象假设它们“拥有”OpenGL运行时中的状态,因此如果您有两个同时对OpenGL进行更改,则输出会变得混乱。在您的情况下,OrthogonalTiledMapRenderer
有自己的SpriteBatch
,因此您有两个SpriteBatch
(默默地)互相争斗。
尝试更改Map.render()
方法以在渲染地图之前结束正在进行的SpriteBatch(然后重新启动它):
@Override
public void draw(SpriteBatch batch, float parentAlpha) {
batch.end();
this.render.setView((OrthographicCamera) this.getStage().getCamera());
render.render();
batch.begin();
}
如果这有帮助,您可能会考虑设置您的磁贴地图以“共享”与其余代码相同的SpriteBatch
(因为这些是有点重的对象)。这应该更有效率,并且不需要结束/启动SpriteBatch
。
答案 1 :(得分:2)
我有一个类似的问题,我使用批处理首先绘制一个tilemap,然后是我自己的纹理。它绘制了与纹理完全相同大小和位置的白色矩形。
batch.setProjectionMatrix(camera.combined);
batch.begin();
mapRenderer.render();
GameObjectSystem.inst().render(RenderLayer.floor, batch);
GameObjectSystem.inst().render(RenderLayer.ground, batch);
batch.end();
在绘制tilemap并重新启动它之后结束批处理修复了问题。
batch.setProjectionMatrix(camera.combined);
batch.begin();
mapRenderer.render();
batch.end();
batch.begin();
GameObjectSystem.inst().render(RenderLayer.floor, batch);
GameObjectSystem.inst().render(RenderLayer.ground, batch);
batch.end();