Как нарисовать bitmapfont на сцене в libgdx?

Это мой текущий метод рендеринга на моем уровне в моей игре Libgdx. Я пытаюсь нарисовать BitmapFont в правом верхнем углу моего уровня, но все, что я получаю, это куча белых ящиков.

 @Override
    public void render(
            float delta ) {
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        this.getBatch().begin();

            //myScore.getCurrent() returns a String with the current Score
        font.draw(this.getBatch(), "Score: 0" + myScore.getCurrent(), 600, 500);
        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();
        this.getBatch().end();
        }

Я хотел бы добавить шрифт score в какой-то актер, а затем сделать сцену.addActor (myScore), но я не знаю, как это сделать. Я следовал учебнику Штайгерта, чтобы создать основной класс игры, который создает экземпляр сцены, шрифта, в классе AbstractLevel, который затем расширяется этот уровень.

до сих пор я не использую пользовательский шрифт, только пустой новый BitmapFont(); использовать по умолчанию Arial шрифт. Позже я хотел бы использовать свой собственный более причудливый шрифт.

4 ответов


попробуйте переместить шрифт.нарисуйте после сцены.рисовать. Добавить его к актеру было бы очень просто, просто создайте новый класс и расширьте актера как такового

import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Actor;

public class Text extends Actor {

    BitmapFont font;
    Score myScore;      //I assumed you have some object 
                        //that you use to access score.
                        //Remember to pass this in!
    public Text(Score myScore){
        font = new BitmapFont();
            font.setColor(0.5f,0.4f,0,1);   //Brown is an underated Colour
    }


    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
         font.draw(batch, "Score: 0" + myScore.getCurrent(), 0, 0);
         //Also remember that an actor uses local coordinates for drawing within
         //itself!
    }

    @Override
    public Actor hit(float x, float y) {
        // TODO Auto-generated method stub
        return null;
    }

}

надеюсь, что это помогает!

Edit 1: Также попробуйте System.out.println(myScore.getCurrentScore()); просто чтобы убедиться, что это не проблема. Вы можете просто заставить его вернуть float или int, и когда вы делаете "Score:"+ немного, это превратит его в строку


Ну, в этом случае вам может потребоваться позвонить this.getBatch().end первый. Вот так:

mSpriteBatch.begin();
mStage.draw();
mSpriteBatch.end();
//Here to draw a BitmapFont
mSpriteBatch.begin();
mBitmapFont.draw(mSpriteBatch,"FPS",10,30);
mSpriteBatch.end();

Я не знаю, почему, но это работает для меня.


Я решил аналогичную проблему с белыми ящиками, закрыв пакет перед началом этапа рисования. Это потому, что сцена.draw () запускает другую партию и делает недействительной предыдущую партию, не закончившуюся end ().

поэтому в текущем примере я бы переместил этого.getBatch ().end () перед этапом розыгрыша:

    ...
    font.draw(this.getBatch(), "Score: 0" + myScore.getCurrent(), 600, 500);
    this.getBatch().end();
    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();
    }

Если вы используете Scene2D, попробуйте использовать сцену и актеров. Нет необходимости писать длинные коды, проверьте плагин MTX, который очень прост в использовании. Вы можете создать удивительный пользовательский опыт

http://moribitotechx.blogspot.co.uk/