Zrobiłem to w ten sposób:
Najpierw stworzyłem nową klasę o nazwie Hud. Implementuje Disposable
ze względu na zarządzanie zasobami. Następnie musisz zdefiniować a Stage
dla swojej zawartości i nową, viewport
ponieważ zostanie użyta nowa kamera. Musisz zdefiniować nowy Table
, który możesz dodać do Stage
. Możesz dodawać swoje treści do table
zwykłej wersji. Reszta kodu, który przedstawię, aby pokazać, jak to działa, jest specyficzna dla gry, więc po prostu zignoruj ją.
public class Hud implements Disposable{
public Stage stage;
private Viewport viewport;
//score && time tracking variables
private Integer worldTimer;
private float timeCount;
private static Integer score;
private boolean timeUp;
//Scene2D Widgets
private Label countdownLabel, timeLabel, linkLabel;
private static Label scoreLabel;
public Hud (SpriteBatch sb){
//define tracking variables
worldTimer = 250;
timeCount = 0;
score = 0;
//setup the HUD viewport using a new camera seperate from gamecam
//define stage using that viewport and games spritebatch
viewport = new FitViewport(GetTheTriforce.V_WIDTH, GetTheTriforce.V_HEIGHT, new OrthographicCamera());
stage = new Stage(viewport, sb);
//define labels using the String, and a Label style consisting of a font and color
countdownLabel = new Label(String.format("%03d", worldTimer), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
scoreLabel =new Label(String.format("%06d", score), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
timeLabel = new Label("LEFTOVER TIME", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
linkLabel = new Label("POINTS", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
//define a table used to organize hud's labels
Table table = new Table();
table.top();
table.setFillParent(true);
//add labels to table, padding the top, and giving them all equal width with expandX
table.add(linkLabel).expandX().padTop(10);
table.add(timeLabel).expandX().padTop(10);
table.row();
table.add(scoreLabel).expandX();
table.add(countdownLabel).expandX();
//add table to the stage
stage.addActor(table);
}
public void update(float dt){
timeCount += dt;
if(timeCount >= 1){
if (worldTimer > 0) {
worldTimer--;
} else {
timeUp = true;
}
countdownLabel.setText(String.format("%03d", worldTimer));
timeCount = 0;
}
}
public static void addScore(int value){
score += value;
scoreLabel.setText(String.format("%06d", score));
}
@Override
public void dispose() { stage.dispose(); }
public boolean isTimeUp() { return timeUp; }
public static Label getScoreLabel() {
return scoreLabel;
}
public static Integer getScore() {
return score;
}
}
a następnie na ekranie odtwarzania w następujący sposób:
przede wszystkim potrzebujesz zmiennej, aby odwoływać się do twojego hudu:
private Hud hud;
a następnie w konstruktorze tworzysz nową instancję swojej klasy:
hud= new Hud();
w metodzie aktualizacji musisz umieścić następujące wiersze kodu, ponieważ myślę, że chcesz wyświetlić niektóre informacje o grze, takie jak punkty lub pozostałe życia:
hud.update();
w metodzie renderowania zrób to:
//Set batch to now draw what the Hud camera sees.
game.batch.setProjectionMatrix(hud.stage.getCamera().combined);
hud.stage.draw();
i na koniec nie zapomnij pozbyć się hudu metodą usuwania
Mam nadzieję że to pomogło
camera.project(Vector3 screenCoords)
do projekcji czegoś od współrzędnych świata do ekranów przewodów.