如何使用 Libgdx/Java 绘制文本?
Posted
技术标签:
【中文标题】如何使用 Libgdx/Java 绘制文本?【英文标题】:How can I draw text using Libgdx/Java? 【发布时间】:2012-09-10 02:09:31 【问题描述】:我在谷歌上搜索如何使用 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()
调用,如果将其取出,一切正常(但当然没有文字)。
【问题讨论】:
【参考方案1】:当我创建位图字体时是这样的:
font = new BitmapFont(Gdx.files.internal("Calibri.fnt"),Gdx.files.internal("Calibri.png"),false);
通过下载一些字体文件来试试这个(下载字体时请检查.fnt文件和.png文件是否包含相同)
【讨论】:
@Asgeir 如果您觉得有帮助,请不要忘记接受答案 没什么区别。用“new BitmapFont()”实例化它将使用默认的嵌入字体。 而单独的 BitmapFont 不会渲染。 BitmapFont 是它如何呈现文本的配置。批处理使用 BitmapFont 和一个字符串(要绘制的文本)绘制文本【参考方案2】:尝试调用多个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()
)。【参考方案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();
这会顺利进行。
【讨论】:
对于那些使用.setScale();
的人,它会显示一个错误,这意味着您拥有更新版本的 LibGDX。改用font.getData().setScale(0.2f);
【参考方案4】:
我认为没有太多理由为文本绘图创建单独的批处理。使用 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/
【讨论】:
以上是关于如何使用 Libgdx/Java 绘制文本?的主要内容,如果未能解决你的问题,请参考以下文章