如何使用Libgdx / Java绘制文本?

时间:2012-09-17 20:09:38

标签: java graphics libgdx

我在使用Libgdx绘制如何绘制简单的2D文本方面遇到了很多麻烦。这是我到目前为止编写的代码:

SpriteBatch spriteBatch;
BitmapFont font;
CharSequence str = "Hello World!";
spriteBatch = new SpriteBatch();
font = new BitmapFont();

spriteBatch.begin();
font.draw(spriteBatch, str, 10, 10);
spriteBatch.end();

代码确实绘制了Hello World字符串,然而,它会弄乱我所有的其他绘图。他们在那里,只是残忍地残缺,并且所有这一切都在移动。我几乎在每个语句子集周围尝试过Gdx.gl11.glPushMatrix()Gdx.gl11.glPopMatrix()

我已经将残缺的图纸缩小到font.draw()电话,如果已经取出,一切正常(但当然没有文字)。

4 个答案:

答案 0 :(得分:22)

我没有太多理由为文本绘图创建单独的批处理。使用gdxVersion =' 1.4.1' (在Android Studio中使用gradle构建)代码成功绘制文本:

BitmapFont font = new BitmapFont(); //or use alex answer to use custom font

public void render( float dt )
  {
    batch.setProjectionMatrix(camera.combined); //or your matrix to draw GAME WORLD, not UI

    batch.begin();

    //draw background, objects, etc.
    for( View view: views )
    {
      view.draw(batch, dt);
    }

    font.draw(batch, "Hello World!", 10, 10);

    batch.end();
  }

注意,在这里你绘制游戏世界坐标,所以如果你的角色移动(例如在平台游戏中),那么文字也会移动。如果你想看到文本,它将被固定在屏幕上,比如Label / TextField或者它在不同的UI框架中的调用方式,比我建议使用Stage(和TextArea用于文本),请参阅示例如何使用在此阶段:http://www.toxsickproductions.com/libgdx/libgdx-basics-create-a-simple-menu/

答案 1 :(得分:13)

当我创建Bitmap字体时,它是这样的:

font = new BitmapFont(Gdx.files.internal("Calibri.fnt"),Gdx.files.internal("Calibri.png"),false);

尝试下载一些字体文件(下载字体时,请检查是否包含.fnt文件和.png文件)

答案 2 :(得分:4)

尝试调用多个batch.begin()和batch.end():

CharSequence str = "Hello World!";
spriteBatch = new SpriteBatch();
font = new BitmapFont();

spriteBatch.begin();
font.draw(spriteBatch, str, 10, 10);
spriteBatch.end();
spriteBatch.begin();
//draw your other sprites here
spriteBatch.draw(...);
spriteBatch.end();

或只使用SpriteBatch的其他实例

答案 3 :(得分:3)

要创建.fnt文件,请使用LibGDX网站提供的hiero。

设置字体150的大小,它将创建一个.fnt文件和一个.png文件。复制资产文件夹中的两个文件。

声明字体:

BitmapFont font;

加载字体:(在创建方法中)

font = new BitmapFont(Gdx.files.internal("data/rayanfont.fnt"), false);
//rayanfont is the font name

渲染:

batch.begin();
font.setScale(.2f);
font.draw(batch, "hello", x,y);
batch.end();

这将顺利进行。