UI - UQcsse3200/2024-studio-2 GitHub Wiki

Introduction

There are expected to be several UI displays in the game, e.g. main menu, player stats, level text, pop-up menus, etc. The game engine makes use of libgdx's Scene2D class to render UI elements such as images and text to the screen.

Key Components

  • Renderer - Creates the stage, a canvas for UI elements (actors): Renderer.
  • Render Service - Provides global access to the stage: RenderService.
  • UI Components - Components containing actors to render onto the stage: extend UIComponent.

Usage

Create a UI entity and add UI Components to it (entities can have multiple UI components as long as there's only one of each type):

Entity UI = new Entity();
UI.addComponent(new GameAreaDisplay("Box Forest"));

The UI component should extend UIComponent:

public class UIDisplay extends UIComponent {
  private Label label;

  @Override
  public void create() {
    super.create();
    addActors();
  }

Create actors and add them to the stage in create(). Anything that isn't automatically rendered by the stage should be added to draw().

  • Example without using libgdx Table:
  private void addActors() {
    label = new Label("Hello World", skin);
    label.setFontScale(2f);
    stage.addActor(title);
  }

  @Override
  public void draw(SpriteBatch batch)  {
    // change position in case of window resize
    int screenHeight = Gdx.graphics.getHeight();
    float offsetX = 10f;
    float offsetY = 30f;
    label.setPosition(offsetX, screenHeight - offsetY);
  }
  • Example with libgdx Table:
private void addActors() {
    // Create table
    table = new Table();
    table.top().left();
    table.setFillParent(true);
    table.padTop(30f).padLeft(10f);
    
    // Add an image
    label = new Label("Hello World", skin);
    label.setFontScale(2f);

    table.add(label).pad(5);
    stage.addActor(table);
  }

  @Override
  public void draw(SpriteBatch batch)  {
    // changing position on window resizing is handled by the stage
  }

Remove actors from the stage in dispose():

  @Override
  public void dispose() {
    super.dispose();
    title.remove();
  }
}

Add loading bar and update its progress by using update():

private void addActors() {
    table = new Table();
    table.setFillParent(true);

    loadingLabel = new Label("Loading...", skin);
    progressBar = new ProgressBar(0, 1, 0.01f, false, skin);
    progressBar.setValue(0);

    table.add(loadingLabel).expandX().padTop(50);
    table.row();
    table.add(progressBar).width(300).padTop(20);
    stage.addActor(table);
}

@Override
public void update() {
    super.update();
    progress += 0.05f; //progress should equal to resourceService.Progress(), but this is just an example.  
    System.out.println(progress);
    progressBar.setValue(progress);
        
}

Add background image by using draw():

@Override
public void draw(SpriteBatch batch) {
    batch = new SpriteBatch();
    batch.begin();
    batch.draw(backgroundTexture, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    batch.end();
}

Set a color for a background:

Pixmap pixmap = new Pixmap(1, 1, Pixmap.Format.RGBA8888);
pixmap.setColor(Color.WHITE); // Set color to white
pixmap.fill();
// Create a Drawable from the Pixmap
Drawable backgroundDrawable = new TextureRegionDrawable(new TextureRegion(new Texture(pixmap)));
// Dispose of the Pixmap after creating the texture
pixmap.dispose();

table.setSize(1980, 1080);
table.setBackground(backgroundDrawable);