簡體   English   中英

libgdx添加分數BitmapFont

[英]libgdx adding score BitmapFont

我正在嘗試在游戲中添加一個分數,它應該以分數:0開頭,並且每當物體被命中時,在分數中添加1。 字體正在工作,並且顯示“ score:” [不是0] Collision有效。

public class PlayState extends State {
    private int score;
    private String scoreName;
    private BitmapFont font;

    public PlayState(GameStateManager gsm) {
        super(gsm);
        score = 0;
        scoreName = "score: 0";
        font = new BitmapFont(Gdx.files.internal("font.fnt"));
   }

   @Override
   public void update(float dt) {
        handleInput();
        if(ObjectA.collides(ObjectB.getBounds()))
            scoreName = "score: " + ++score;
   }

   @Override
   public void render(SpriteBatch sb) {
        sb.setProjectionMatrix(cam.combined);
        sb.begin();

        font.setColor(0.5f, 0.5f, 0.5f, 0.5f);
        font.getData().setScale(0.4f);
        font.draw(sb, scoreName, cam.position.x, cam.position.y);

        sb.end();
    }

ApplicationAdapter類

public class XY extends ApplicationAdapter {

        public static final int WIDTH = 480;
        public static final int HEIGHT = 800;

        public static final String TITLE = "XY";
        private GameStateManager gsm;
        private SpriteBatch batch;

        @Override
        public void create () {
            batch = new SpriteBatch();
            gsm = new GameStateManager();
            Gdx.gl.glClearColor(1, 0, 0, 1);
            gsm.push(new MenuState(gsm));
        }

        @Override
        public void render () {
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);   
            gsm.update(Gdx.graphics.getDeltaTime());
            gsm.render(batch);       
        }

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

GameStateManager

public class GameStateManager {

    private Stack<State> states;

    public GameStateManager(){
        states = new Stack<State>();
    }

    public void push(State state){
        states.push(state);
    }

    public void pop(){
        states.pop().disposed();
    }

    public void set(State state){
        states.pop().disposed();
        states.push(state);
    }

    public void update(float dt){
        states.peek().update(dt);
    }

    public void render(SpriteBatch sb){
        states.peek().render(sb);
    }
}

您需要預先遞增,以便樂譜名稱具有更新后的值。

if(ObjectA.collides(ObjectB.getBounds()))
            scoreName = "score: " + ++score;
            }

您之前的代碼將始終在比實際分數晚一點的位置顯示分數名稱。

此外,根據您的代碼,您需要在調用main上的update之后調用總渲染,否則您的分數將不會被更新。 最后,當您引用類內部的類屬性時,請習慣於編寫this.score

根據給定的代碼,如果您要從游戲的render方法調用update方法,則得分值會不斷增加。 ObjectA.collides(ObjectB.getBounds()時,將分數附加字符串值分配給scoreName。

命中后,將分數增加1並將新值添加到用於顯示分數的scoreName。

@Override
public void update(float dt) {
   handleInput();
   if(ObjectA.collides(ObjectB.getBounds())){     
       score++; 
       scoreName = "score: " + score; 
   }
}

但這不是您的問題,問題是字體無法在屏幕上以增加的值繪制分數。

可能的原因可能是您的字體沒有數字字符,因此請檢查您的字體及其.png文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM