1

我正在使用 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 问题的建议吗?

4

2 回答 2

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.

于 2013-04-08T16:27:19.750 回答
2

我有一个类似的问题,我使用批处理首先绘制瓷砖地图,然后是我自己的纹理。它以与纹理完全相同的大小和位置绘制了白色矩形。

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    mapRenderer.render();
    GameObjectSystem.inst().render(RenderLayer.floor, batch);
    GameObjectSystem.inst().render(RenderLayer.ground, batch);
    batch.end();

在绘制瓷砖地图并重新启动它后结束批处理解决了问题。

    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();
于 2013-10-25T22:07:21.667 回答