使用libgdx在运行时生成带有文本的纹理

3
我正在开发一个手机文字游戏。昨天,我决定使用libgdx切换到OpenGL,以尝试改善图形性能和电池使用情况,并且能够更多地覆盖平台。
在2D画布上绘制字母瓷砖的方式是每个字母瓷砖为自己创建一个位图。我会:
  1. 从背景位图中创建一个新的可变位图。
  2. 在新位图上绘制字母。
  3. 应用其他特定于瓷砖的效果。
  4. 为每一帧绘制新位图
我应该如何使用libgdx实现我的需求呢?
  1. 我应该采用类似的方法吗?如果是这样,怎么做?我尝试使用pixmaps,但不知道如何绘制字体。
  2. 我应该创建一个包含从A到Z所需所有瓷砖的精灵表,并只使用它吗?当我调整瓷砖背景的设计时,这有点乏味。
  3. 我应该做一些完全不同的事情吗?
显然,最终的代码不应每次都从文件中加载,因为这会对性能造成巨大的影响,但是对于任何试图实现相同结果的其他人,下面是可行的示例代码。
    // load the background into a pixmap
    Pixmap tile = new Pixmap(Gdx.files.getFileHandle(
            "someFile.png", FileType.Internal));

    // load the font
    FileHandle handle = Gdx.files.getFileHandle("someFont.fnt",
            FileType.Internal);
    BitmapFont font = new BitmapFont(handle);

    // get the glypth info
    BitmapFontData data = font.getData();
    Pixmap fontPixmap = new Pixmap(Gdx.files.internal(data.imagePaths[0]));
    Glyph glyph = data.getGlyph(getLetterToDraw().charAt(0));

    // draw the character onto our base pixmap
    tile.drawPixmap(fontPixmap, (TILE_WIDTH - glyph.width) / 2, (TILE_HEIGHT - glyph.height) / 2,
            glyph.srcX, glyph.srcY, glyph.width, glyph.height);

    // save this as a new texture
    texture = new Texture(tile);
1个回答

3
您可以创建一个BitmapFontData实例,并使用BitmapFontData.getImagePath()来加载包含glyphsPixmap。然后,您可以使用BitmapFontData.getGlyph获取Pixmap中特定字形的位置,并将其与Pixmap.drawPixmap()一起使用以执行所需操作。来源
您可以通过BitmapFontData的路径获取文件句柄,并使用以下方法创建新的Pixmap

Pixmap(FileHandle file)

从给定的文件创建一个新的 Pixmap 实例。

来源 使用Gdx.files.internal(pathfromBitmapFontData)作为文件句柄,即可获得包含所有字形的Pixmap
例如:Pixmap p = new Pixmap(Gdx.files.internal(myBitmapFontData.getImagePath()))。请注意,此文件可能不是内部文件。
也可以使用myFont.getData().getFontFile()来创建Pixmap
例如:Pixmap p = new Pixmap(myFont.getData().getFontFile())

我的问题是如何将BitmapFont绘制到像素图上。有什么想法吗?即如何从位图字体获取像素图? - Will Calderwood
我也发现了这个问题,如果你能解释一下如何“使用BitmapFontData.getImagePath来加载包含字形的Pixmap”,那就有所进展了。 - Will Calderwood
我目前只是使用libgdx默认字体进行测试。我将尝试创建一个位图字体,并查看是否可以使用它来工作。 - Will Calderwood
你可以使用默认的 getData() 方法来获取 BitmapFontData。你甚至可以获得 pixmap 文件的 Filehandle!font.getData().getFontFile(); - bemeyer
谢谢你的帮助。我无法使用默认位图字体使其工作。但最终我用自己创建的字体解决了问题。我会更新我的问题并附上最终代码。 - Will Calderwood

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