Libgdx FreeTypeFont:动态生成的字体不会在Label中缩放

时间:2015-09-25 13:07:18

标签: user-interface libgdx scene2d hud

我试图弄清楚如何为我的全新游戏实现HUD界面。 我想通过使用scene2d.ui小部件来创建它,因为我听说它更适合于响应式UI。 所以,我试图创建一个简单的HUD,其中得分标签在屏幕的右上方对齐,暂停按钮放在屏幕的左上角。

现在......我正在使用填充舞台的根表(如表格指南https://github.com/libgdx/libgdx/wiki/Table#quickstart中所述)。

我想创建一个自定义类来处理所有hud接口,例如:

public class Hud extends Table{

    private Label scoreLabel;
    private Button pauseButton;

    public Hud(){
      setFillParent(true);

      BitmapFont font = (BitmapFont)    MyGame.assetManager.get(Constants.COUNTERS_FONT_NAME);

      LabelStyle labelStyle = new LabelStyle(font,Color.WHITE);
      scoreLabel = new Label("score:0", labelStyle);

      add(scoreLabel).width(2).height(1);

   }
}

我正在与之抗争的问题如下:标签内的文字不会留在标签内。 我的意思是:激活调试模式我可以看到表示具有正确尺寸的Label的矩形......但是文本完全超出界限且不能缩放。

正如您所看到的,我使用的字体是BitmapFont,它是在游戏通过FreeTypeFont库启动时生成的...然后将字体添加到游戏的AssetsManager中。

我发布了用于将字体生成器添加到资产管理器的代码:

    //Register the FreeTypeFontGeneratorLoader
    InternalFileHandleResolver resolver = new InternalFileHandleResolver();
    assetManager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
    assetManager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));


    //Load fonts
    FreeTypeFontLoaderParameter countersFontParameters = new FreeTypeFontLoaderParameter();
    countersFontParameters.fontFileName = Constants.BASE_FONT_NAME;
    countersFontParameters.fontParameters.size = 45;
    countersFontParameters.fontParameters.borderColor = Color.BLACK;
    countersFontParameters.fontParameters.borderWidth = 1;

    assetManager.load(Constants.COUNTERS_FONT_NAME, BitmapFont.class, countersFontParameters);

如您所见,我只加载一个45像素大小的BitmapFont。

我不知道问题是什么;我想尝试使用经典的BitmapFont .fnt来查看问题是否与BitmapFont的生成方式有关,但我也想保留FreeTypeFont解决方案。

提前致谢,

卢卡

P.S。

关于舞台的一件事......它使用ScalingViewport,因此尺寸不是以像素为单位,而是以虚拟单位(因为我的游戏使用Box2d,我需要一个共同的单位用于渲染和物理模拟)。

2 个答案:

答案 0 :(得分:3)

我非常确定Label会自动缩放视口,直到您调用 label.setFontScale(theScale)明确表示。

在我看来,最好的想法是创建另一个专门用于HUD 的舞台,这样你就可以使用ScalingViewport(我承认我从来没有使用过这个 - 是不是更好地使用一些填充或类似这样的东西?)和上面的FitViewport 的另一个阶段。

我发现它非常合理和直观,因为它就像在驾驶汽车时将你的HUD显示在你的汽车挡风玻璃上一样。

代码应如下所示:

    //in your show method
    viewport = createYourScalingViewport();     
    stage = new Stage();    

    stage.setViewport(viewport);

    HUDviewport = new FitViewport(screenWidth, screenHeight);
    HUDstage = new Stage();

    HUDstage.setViewport(HUDviewport);

    ...

    //adding some actor to stages
    stage.addActor(actor1);
    stage.addActor(actor2);

    //BUT
    HUDstage.addActor( yourHudInstance );

    ...

    //then in your render method act() and draw() stage then HUDstage so the HUD will be above stage
    stage.act();
    stage.draw();

    HUDstage.act();
    HUDstage.draw();

请记住调整大小屏幕方法中调整窗口大小时更新HUDviewport

答案 1 :(得分:0)

我想我已经解决了我的问题。 似乎设置标签尺寸没有意义。

如果有人需要在标签内部呈现文本紧密的容器,那么最好的解决方案是在下面创建一个自定义类来扩展Horizo​​naltGroup(o VerticalGroup)。

让我们想象一下,我的游戏需要一个分数标签:

public class ScoreLabel extends HorizontalGroup{

 ...

}

在这个类中,我创建了一个Label属性,并将其添加为Actor。

public class ScoreLabel extends HorizontalGroup{

 private Label scores;
 public static final float FONT_SCALE = 0.9f;

 public ScoreLabel(){

    BitmapFont font = MyGame.assetManager.get(Constants.COUNTERS_FONT_NAME);
    LabelStyle labelStyle = new LabelStyle(font, Color.WHITE);
    scores = new Label(getScoreText(), labelStyle);
    scores.setAlignment(Align.left);
    scores.setFontScale(FONT_SCALE);   


    addActor(scores);
 }

}

如果激活调试模式,您会注意到有一个容器对文本的呈现非常紧密。 上面的代码只是加载之前在游戏资产管理器中加载的BitmapFont。 然后应用字体缩放...我猜它可以添加到皮肤属性中 无论如何......这对我来说是最好的解决方案。 我仍在使用带有ScalingViewport的舞台,这样我就不会将像素用作单位,所有尺寸都会缩放以填充设备屏幕。

再见,

卢卡