在libGDX中使用TrueType字体

43

有人知道我如何在libGDX中使用TTF字体吗?我找过并看到一些关于StbTrueTypeFont的东西,但它似乎不在最新版本中。

编辑:我找到了StbTrueType字体相关的内容,jar文件位于扩展目录中。我已将其添加到我的项目中。现在我只需要弄清如何使用它。有示例吗?


我在哪里可以获取这个库文件?我已经到处找过了。我找到的唯一几个地方(都不起作用)是: http://code.google.com/p/libgdx/source/browse/trunk/extensions/stb-truetype/libs/stbtruetype-natives.jar?r=3031 http://code.google.com/p/libgdx/source/browse/trunk/extensions/gdx-stb-truetype/libs/gdx-stb-truetype-natives.jar?r=3363 - android developer
请前往此链接:http://libgdx.badlogicgames.com/nightlies/ 并下载“libgdx-nightly-latest.zip”文件,您将在该文件的extensions目录中找到JAR包。 - Alex_Hyzer_Kenoyer
我需要使用哪些JAR文件?我尝试添加了"gdx-stb-truetype.jar",但它一直崩溃并给出异常,例如"javax.media.opengl.GLException: java.lang.NoClassDefFoundError: com/badlogic/gdx/utils/SharedLibraryLoader..."。 - android developer
1
你需要 gdx-stb-truetype-natives.jargdx-stb-truetype.jar。将它们添加到你的主项目中,并确保将它们添加到构建路径中。 - Alex_Hyzer_Kenoyer
仍然存在相同的错误。我甚至尝试使用桌面项目所需的其他最新库,但没有效果(没有错误,但我看不到文本和其他一些东西): gdx-backend-jogl-natives.jar gdx-backend-jogl.jar gdx-natives.jar gdx-sources.jar gdx-stb-truetype-natives.jar gdx-stb-truetype.jar gdx.jar - android developer
5个回答

42

你需要将gdx-stb-truetype的jar包添加到你的项目中,就像你在编辑中所述的那样。这里是如何使用它的,非常简单明了...

首先,你需要声明你要使用的BitmapFont以及字符...

BitmapFont font;
public static final String FONT_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789][_!$%#@|\\/?-+=()*&.;,{}\"´`'<>";

接下来,您需要创建字体...

font = TrueTypeFontFactory.createBitmapFont(Gdx.files.internal("font.ttf"), FONT_CHARACTERS, 12.5f, 7.5f, 1.0f, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
font.setColor(1f, 0f, 0f, 1f);

你可以尝试调整传递给 createBitmapFont() 的参数,看看它们的作用。

然后按照通常方式渲染字体即可...

batch.begin();
font.draw(batch, "This is some text", 10, 10);
batch.end();

3
我该如何在 com.badlogic.gdx.scenes.scene2d.ui.Label 等 UI 元素中使用这个字体?是否有可能实现? - uni
4
与任何“BitmapFont”一样,您可以通过在“Label”构造函数中传递“LabelStyle”来应用到“Label”。在“LabelStyle”中,您可以指定一个字体。http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/ui/Label.html - TalkLittle

28

使用 gdx-freetype 扩展库:

FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile);
BitmapFont font15 = generator.generateData(15);
BitmapFont font22 = generator.generateData(22);
generator.dispose();

"要使用gdx-freetype,需要下载最新的nightlies版本,将 gdx-freetype.jargdx-freetype-natives.jar 文件链接到你的桌面工程中,将 gdx-freetype.jar 文件链接到你的安卓工程中,并将 armeabi/libgdx-freetype.soarmeabi-v7a/libgdx-freetype.so 文件复制到安卓工程的 libs/ 文件夹中,就像处理 libgdx.so 文件一样。"

来源:http://www.badlogicgames.com/wordpress/?p=2300


这种方式生成的BitmapFont是否可以设置颜色?我无法在其上使用.setColor(rgb)。 - kelorek
1
@kelorek 试过使用setColor(r, g, b, a)了吗?http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/graphics/g2d/BitmapFont.html - TalkLittle
1
我不建议使用它,因为它没有受到管理,所以当您的游戏恢复时,使用“即时字体”绘制的所有文本都将是白色的。 - Ashraf Sayied-Ahmad
2
只是为了帮助澄清,这些夜间版本可以在此处下载:http://libgdx.badlogicgames.com/nightlies/dist/extensions/gdx-freetype/。 - Richard

11

我做了很多研究,并找到了这个有效的方法:

FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("myfont.ttf"));
FreeTypeFontParameter parameter = new FreeTypeFontParameter();
parameter.size = 12; // font size
BitmapFont font12 = generator.generateFont(parameter);
generator.dispose(); // avoid memory leaks, important

如果您尝试了以上的答案仍然失败,请使用libGDX Freetype Wiki以供参考。


3
这是在S4克隆手机上运行的: Pinewood是一个已下载的字体,位于资产文件夹中。请查看下面的文件夹结构。
import android.util.Log;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;

public class Game implements ApplicationListener {
    private SpriteBatch mSpriteBatch;
    private Texture textureBackground;
    private BitmapFont mBitmapFont;

    public void create() {

        Gdx.graphics.setContinuousRendering(false);
        Gdx.graphics.requestRendering();

        mSpriteBatch = new SpriteBatch();

        Texture.setEnforcePotImages(false);
        textureBackground = new Texture(Gdx.files.internal("background.jpg"));

        FileHandle fontFile = Gdx.files.internal("Pinewood.ttf");
        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile);

        mBitmapFont = generator.generateFont(150);
        generator.dispose();

        mBitmapFont.setColor(0.9f, 0.5f, 0.5f, 1); 
        Log.e("Game", "mBitmapFont.getScaleX() : "+mBitmapFont.getScaleX() + ", mBitmapFont.getScaleY() "+mBitmapFont.getScaleY());

    }

    public void render() {
        Log.e("Game", "render()");

        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // This cryptic line clears the screen.
        mSpriteBatch.begin();
        // Drawing goes here!
        mSpriteBatch.draw(textureBackground, 0, 0);
        mBitmapFont.draw(mSpriteBatch, "FPS:"+Gdx.graphics.getFramesPerSecond(), 110, 260);
        mSpriteBatch.end();     
    }

    public void resize(int width, int height) {
    }

    public void pause() {
    }

    public void resume() {
    }

    public void dispose() {
    }

}

enter image description here


0

你需要使用FreeTypeFont库。github

1.根据Github页面的说明,对于使用gradle的项目,请添加以下依赖项:

核心依赖项:

compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"

桌面应用程序依赖:

compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"

Android依赖项:

compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"

更多细节和平台请参见this页面

如果您不使用Gradle,请参见this

2.在将库添加到项目后,您可以像这样使用它:

FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("myfont.ttf"));
FreeTypeFontParameter parameter = new FreeTypeFontParameter();
parameter.size = 12;
BitmapFont font12 = generator.generateFont(parameter); // font size 12 pixels
generator.dispose(); // don't forget to dispose to avoid memory leaks!

并将myfont.ttf放入核心资产文件夹中


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