Search code examples
javalibgdx

LibGdx: Shaperenderer Rect not being drawn on Screen


Trying to create a simple loading Screen. The below code prints the correct progress, so I know that part works. But the rectangle is not being drawn. Not sure what is wrong.

Full LoadingScreen:

public class LoadingScreen implements Screen {

  private static final float PROGRESS_BAR_WIDTH = MyGdxGame.WIDTH / 2f;
  private static final float PROGRESS_BAR_HEIGHT = 50f;

  GdxAssetManager assetManager;
  Stage stage;
  //Table mainTable;
  private ShapeRenderer shapeRenderer;
  private MyGdxGame game;

  public LoadingScreen(MyGdxGame game){
      this.game = game;
      assetManager = game.getAssetManager();
      shapeRenderer = new ShapeRenderer();
      stage = new Stage(new StretchViewport(MyGdxGame.WIDTH, MyGdxGame.HEIGHT));
  }

  @Override
  public void show() {
      assetManager.loadGeneral();
  }

  @Override
  public void render(float delta) {
      Gdx.gl.glClearColor(1, 1, 1, 1);
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

      renderProgressBar();

      if (assetManager.getManager().update()) {
          game.setScreen(new LoginScreen(game));
      }

      stage.act(Gdx.graphics.getDeltaTime());
      stage.draw();
  }

  private void renderProgressBar() {
      float progress = assetManager.getManager().getProgress();
      System.out.println(PROGRESS_BAR_WIDTH * progress);
      shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
      shapeRenderer.setColor(Color.RED);
      shapeRenderer.rect(
            (MyGdxGame.WIDTH - PROGRESS_BAR_WIDTH) / 2f,
            (MyGdxGame.HEIGHT - PROGRESS_BAR_HEIGHT) / 2f,
            PROGRESS_BAR_WIDTH * progress,
            PROGRESS_BAR_HEIGHT
      );
      shapeRenderer.end();
  }

  @Override
  public void resize(int width, int height) {
      stage.getViewport().update(width, height);
  }

  @Override
  public void pause() {

  }

  @Override
  public void resume() {

  }

  @Override
  public void hide() {
      dispose();
  }

  @Override
  public void dispose() {
      stage.dispose();
      shapeRenderer.dispose();
  }
}

I guess methods of interest are render and renderProgressBar. Like I said, all I get is a white background until the loading is finished, but the print inside renderProgressBar prints the correct values.


Solution

  • Set projectionMatrix of ShapeRenderer using stage camera.

    shapeRenderer.setProjectionMatrix(stage.getCamera().combined);