Как нарисовать 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, который очень прост в использовании. Вы можете создать удивительный пользовательский опыт