m.a*_*icz 5

我担心没有默认机制来制作下标或上标,但在使用Scene2d及其Label类时似乎很简单.

我们的想法是使用您的文本(例如某些数字)呈现标准标签,然后使用下标或上标文本计算并添加到标签的较小版本.代码看起来像:

    Label label = new Label("2", skin, "default");
    Label subscript = new Label("n", skin, "smaller");

    subscript.setPosition(label.getX() + label.getWidth() + xLittleOffset, label.getY() + yOffset);
Run Code Online (Sandbox Code Playgroud)

如果你不想持有Label的两种样式,你可以创建下标作为它的默认版本,只需应用一些比例.

    Label subscript = new Label("n", skin, "default");
    subscript.setFontScale(0.5f);

    ...
Run Code Online (Sandbox Code Playgroud)

当然可以不使用Scene2d而是简单的批量渲染来实现它,只需在正常情况下渲染较小的文本,使用一些y轴偏移

draw(Batch batch, java.lang.CharSequence str, float x, float y, float targetWidth, int halign, boolean wrap)
Run Code Online (Sandbox Code Playgroud)

绘图功能的版本.代码如下:

    BitmapFont font = createTheFont(); // here you are creating the font

    //...

    //in your render function:
    batch.begin();

    font.draw(batch, "2", x, y, width, halign, false);

    font.setScale(.2f);
    font.draw(batch, "n", x + width, y + someOffset, n_width, halign, false);

    batch.end();
Run Code Online (Sandbox Code Playgroud)

如果你需要 Label或文本中渲染下标/上标,那将会有点困难但并非不可能 - 你需要做的就是以某种方式计算你的字形的位置,并为它增加一些原始空间留一点空间.

计算字形位置相当困难,但您可以迭代Label GlyphRuns及其xAdvances值(左侧偏移量).根据以下内容尝试自己弄清楚:

    float x, y; //positions of glyph after which you want to add subscipt/superscript

    for(GlyphRun run : label.getGlyphLayout().runs)
    {
        for(int i = 0; i < run.xAdvances.size - 1; i++)
        {
            x += run.xAdvances.get(i));
        }

        //now you are after run so you can modify y position
        y += rowHeight; //I'm not sure but it probably should be that rowHeight = label.getStyle().font.getLineHeight();
    }
Run Code Online (Sandbox Code Playgroud)

查看本文以了解有关新Libgdx版本中字形,字体等的更多信息

不幸的是,我不知道如何在使用批处理时实现它

你可以在这里阅读更多关于Scene2d的信息:https://github.com/libgdx/libgdx/wiki/Scene2d