Ich habe es so gemacht:
Zuerst habe ich eine neue Klasse namens Hud erstellt. Es implementiertDisposable
aufgrund der Ressourcenverwaltung. Dann müssen Sie eine Stage
für Ihren Inhalt und eine neue definieren, viewport
da eine neue Kamera verwendet wird. Sie müssen ein neues definieren Table
, das Sie dem hinzufügen können Stage
. Sie können Ihre Inhalte table
wie gewohnt hinzufügen . Der Rest des Codes ist spielspezifisch. Ignoriere ihn einfach.
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;
}
}
und dann im Wiedergabebildschirm wie folgt:
Zuallererst benötigen Sie eine Variable, um auf Ihren Hud zu verweisen:
private Hud hud;
Und dann erstellen Sie im Konstruktor eine neue Instanz Ihrer Klasse:
hud= new Hud();
In der Update-Methode müssen Sie diese Codezeilen einfügen, da ich denke, dass Sie einige Spielinformationen wie Punkte oder die verbleibenden Leben anzeigen möchten:
hud.update();
In der Render-Methode machen Sie folgendes:
//Set batch to now draw what the Hud camera sees.
game.batch.setProjectionMatrix(hud.stage.getCamera().combined);
hud.stage.draw();
und vergessen Sie am Ende nicht, Ihren Hud in der Entsorgungsmethode zu entsorgen
Ich hoffe das hilft
camera.project(Vector3 screenCoords)
, um etwas von Weltkoordinaten auf Bildschirmkabel zu projizieren.