37

我在谷歌搜索如何使用 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

4 回答 4

29

我看不出为文本绘图创建单独的批处理的太多理由。使用 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/

于 2014-12-21T12:38:57.217 回答
15

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

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

通过下载一些字体文件来尝试这个(下载字体时请检查是否包含相同的.fnt文件和.png文件)

于 2012-09-24T10:37:26.017 回答
6

要创建 .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();

这将顺利进行。

于 2013-12-23T17:42:50.877 回答
5

尝试调用多个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 实例

于 2013-12-23T16:07:34.137 回答