如何在 libgdx 的舞台上绘制位图字体?
Posted
技术标签:
【中文标题】如何在 libgdx 的舞台上绘制位图字体?【英文标题】:How to draw a bitmapfont on a stage in libgdx? 【发布时间】:2012-10-30 07:36:37 【问题描述】:这是我当前在我的 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();
我想将乐谱字体添加到某种演员中,然后执行 scene.addActor(myScore) 但我不知道该怎么做。 我按照 Steigert 的教程创建了在 AbstractLevel 类中实例化场景、字体的主游戏类,然后由该级别扩展。
到目前为止,我没有使用任何自定义字体,只是空的 new BitmapFont();使用默认 Arial 字体。以后我想用我自己的更花哨的字体。
【问题讨论】:
【参考方案1】:尝试将 font.draw 移到 stage.draw 之后。将它添加到一个actor会非常简单,只需创建一个新类并像这样扩展Actor
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;
希望这会有所帮助!
编辑 1:
也尝试System.out.println(myScore.getCurrentScore());
只是为了确保这不是问题。你可以让它返回一个浮点数或一个整数,当你执行"Score:"+
位时,它会将它本身变成一个字符串
【讨论】:
谢谢!这可能会奏效,但我发现了一个非常棒的实用程序,称为 Label,它使用的正是我所需要的。我现在将标签扩展为我的乐谱,并将其作为普通演员添加到舞台上。像魅力一样工作。【参考方案2】:好吧,在这种情况下,您可能需要先致电this.getBatch().end
。像这样:
mSpriteBatch.begin();
mStage.draw();
mSpriteBatch.end();
//Here to draw a BitmapFont
mSpriteBatch.begin();
mBitmapFont.draw(mSpriteBatch,"FPS",10,30);
mSpriteBatch.end();
我不知道为什么,但它对我有用。
【讨论】:
【参考方案3】:我通过在开始绘图阶段之前关闭批处理解决了与白框类似的问题。那是因为 stage.draw() 启动了另一个批次,并使之前没有以 end() 结束的批次失效。
所以在当前示例中,我将在绘图阶段之前移动 this.getBatch().end():
...
font.draw(this.getBatch(), "Score: 0" + myScore.getCurrent(), 600, 500);
this.getBatch().end();
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
【讨论】:
【参考方案4】:如果您使用的是 Scene2D,请尝试使用舞台和演员。不用写长代码,找MTX插件,非常好用。您可以创造出色的用户体验
http://moribitotechx.blogspot.co.uk/
【讨论】:
以上是关于如何在 libgdx 的舞台上绘制位图字体?的主要内容,如果未能解决你的问题,请参考以下文章