我试图弄清楚如何为我的全新游戏实现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,我需要一个共同的单位用于渲染和物理模拟)。
答案 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)
我想我已经解决了我的问题。 似乎设置标签尺寸没有意义。
如果有人需要在标签内部呈现文本紧密的容器,那么最好的解决方案是在下面创建一个自定义类来扩展HorizonaltGroup(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的舞台,这样我就不会将像素用作单位,所有尺寸都会缩放以填充设备屏幕。
再见,
卢卡