Tôi đã làm nó như thế này:
Đầu tiên tôi đã tạo ra một Class mới gọi là Hud. Nó thực hiện Disposable
vì quản lý tài nguyên. Sau đó, bạn cần xác định một Stage
cho nội dung của bạn và mới viewport
vì một máy ảnh mới sẽ được sử dụng. Bạn cần xác định một cái mới Table
mà bạn có thể thêm vào Stage
. Bạn có thể thêm nội dung của bạn vào table
như bình thường. Phần còn lại của mã tôi sẽ đưa ra để hiển thị cách thức hoạt động của trò chơi là cụ thể vì vậy hãy bỏ qua nó.
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;
}
}
và sau đó trong Màn hình như thế này:
trước hết bạn cần một biến để tham chiếu hud của bạn như:
private Hud hud;
và sau đó trong hàm tạo, bạn tạo một thể hiện mới của lớp:
hud= new Hud();
trong phương thức cập nhật, bạn cần đặt các dòng mã này vì tôi nghĩ rằng bạn muốn hiển thị một số thông tin trò chơi như điểm hoặc cuộc sống còn lại:
hud.update();
trong phương thức render- làm điều này:
//Set batch to now draw what the Hud camera sees.
game.batch.setProjectionMatrix(hud.stage.getCamera().combined);
hud.stage.draw();
và cuối cùng, đừng quên vứt bỏ hud của bạn trong phương pháp xử lý
tôi hy vọng điều đó sẽ giúp
camera.project(Vector3 screenCoords)
để chiếu một cái gì đó từ tọa độ thế giới đến dây màn hình.