2017-05-07 37 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

该项目太大,无法通过并说明问题的位置。你可以只添加一段你用来调用你的类和它的方法的代码吗? –