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

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个回答

28

我不太明白为什么要创建单独的批次用于文本绘制。在使用 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用于文本),例如,请参见如何在此处使用Stage:http://www.toxsickproductions.com/libgdx/libgdx-basics-create-a-simple-menu/


15

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

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

尝试通过下载一些字体文件来实现(在下载字体时,请检查是否包含相应的 .fnt 文件和 .png 文件)


5
没关系。使用“new BitmapFont()”实例化将使用默认的嵌入字体。 - Gustavo Maciel
1
单独使用BitmapFont无法渲染。BitmapFont是用于渲染文本的配置。批处理使用BitmapFont和字符串(要绘制的文本)来绘制文本。 - Zoe stands with Ukraine

8

要创建一个.fnt文件,可以使用LibGDX网站提供的Hiero工具。

将字体大小设置为150,它将创建一个.fnt文件和一个.png文件。将这两个文件复制到你的assets文件夹中。

声明字体:

BitmapFont font;

加载字体的方法:(在create方法中)
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();

这将可以顺利运行。

3
对于那些正在使用 .setScale(); 函数但出现错误的人,这意味着你正在使用较新版本的 LibGDX。请改用 font.getData().setScale(0.2f); - Joseph Attia

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实例


这种方法并不理想,因为如果你需要在不同的时间渲染大量文本,它会导致过度刷新(在 end() 上)。 - EntangledLoops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接