OrthogonalTiledMapRenderer和普通的Spritebatch渲染一个白盒子?

时间:2013-04-08 15:29:13

标签: java android libgdx

我使用Libgdx渲染TileMap作为我游戏的背景。我稍后可能会渲染一些不同的图层。 如果没有tilemap渲染和单个背景图片,它可以正常工作! 当我使用TiledRender时,会发生一些奇怪的事情: tiled scene with big white box in the upper left

两个白色区域通常是触控板和角色。

触摸板和角色使用以下方式呈现:

@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问题的任何消息?

2 个答案:

答案 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();