2017-05-07 35 views
0

我想在遊戲中添加一個分數,它應該以分數:0開始,每當對象被擊中時將分數加1。字體正在工作,並顯示「得分:」[不是0] 碰撞起作用。libgdx添加分數BitmapFont

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); 
    } 
} 
+0

當分數爲0時,您需要它顯示「分數:0」,分數是1時是否顯示「分數:1」? –

+0

是的,並且當對象A被擊中時每次加1 +1 – Tim272793

+0

你的意思是「它不適合」,還有什麼是這個分數中的「不是0」:「[不是0]' – Aryan

回答

0

根據您提供的代碼,如果您從遊戲的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文件。

+0

對我感到羞恥。是。該字體沒有單個數字字符。 – Tim272793

0

你需要預先增量這樣的比分名稱將有更新的價值。

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

你以前的代碼將始終顯示scorename一個點晚的實際得分。

此外,根據您的代碼,您需要在主調用update之後調用總是呈現,否則您的分數將不會更新。最後,當你引用類中的類屬性時,請自己寫this.score

+0

Thx,我會通知我。但我不明白爲什麼零不顯示。當它只渲染1次它應該說「分數:0」或不是?^^ – Tim272793

+0

發佈您的主要功能或每當您調用這些方法時。 –

+0

該項目太大,無法通過並說明問題的位置。你可以只添加一段你用來調用你的類和它的方法的代碼嗎? –