Libgdx Hud使用两个舞台的方法

3
我有一个应用程序,目前只有一个屏幕,但我需要添加一个侧面显示/区域作为HUD,在其上显示得分/生命等信息,以便左边是HUD,右边是主要的游戏屏幕。主游戏屏幕将被固定,不会四处移动。
从研究中,我发现了一些解决方案:
1.两个舞台 2.一个组,其中包含两个子组,可能使用HorizontalGroup 3.两个相机一个舞台 4.一个舞台,一个相机,但为每组演员更改相机位置。
我认为,选项1是我的首选,但我有一些问题:
- 舞台总是填满整个屏幕吗,还是可以在任意位置开始?这将使得右侧屏幕更容易计算基于该屏幕的0,0位置的位置,而不总是必须将HUD的宽度添加到任何计算中。 - 我需要考虑视口吗?目前我没有使用视口(这意味着我的舞台默认设置为缩放),但没有因此看起来拉伸。我对视口了解不多,但似乎总是需要做出妥协,例如黑色栏顶部或侧面。 - 如果我有两个舞台,它们是否都有自己的相机?我需要考虑这个吗?我是否可以将右手相机瞄准偏移量,以便仍然可以从0,0绘制物体,其中该点是右侧舞台的左下角,而不是整个屏幕? 最后,离题了,我对SpriteBatch有些困惑。因为我使用一个舞台,所以我目前没有使用它。那还好吗?还是应该与舞台一起使用?然后将我的所有演员添加到其中?
1个回答

8
如果我理解正确,您正在使用scene2d来创建游戏世界和HUD。而且HUD不会覆盖游戏世界,而是独占屏幕上的一部分。
舞台并不总是填满整个屏幕。它们没有填充或不填充任何内容的概念,因为它们可以有超出屏幕的对象。但是,它们被剪切到由其Viewport定义的矩形中。
在您的情况下,似乎您需要两个Viewport和两个舞台。您说您没有使用Viewport,但实际上您使用了... Stage会自动创建自己的ScalingViewport,设置为StretchViewport。 (文档中未提及ScalingViewport,这是过时的。)StretchViewport通常很糟糕,因为您的游戏将被扭曲以适应设备的纵横比。
只要您不在ExtendViewports上设置最大宽度/高度,它们就不会导致黑色条纹,并且我认为它们通常是任何游戏世界视图的最佳选择。
您可以设置两个Viewport以覆盖您自己计算的屏幕特定部分。由于这是一个专业的案例,我认为您将不得不直接子类化Viewport类(而不是其中一个子类),并使用viewport.setScreenBounds(...)操作每个Viewport。
关于您的最后一个问题:是的,每个舞台都有自己的Viewport,每个Viewport都有自己的相机。一旦您设置了两个Viewport以在各自的屏幕部分中拥有自己的部分,您还可以将它们设置为将其各自的左下角视为0,0。

使用默认设置的视口时,当我尝试运行setScreenBounds时,没有任何变化。我记录了所有的值它们都已经改变了,但是我的视口仍然感觉整个手机屏幕都在显示。以这种速度,我想我会只使用一个带有两个组的舞台。这个多舞台的东西对我来说毫无意义! - Russ Wheeler
是的,这就是我说你需要自己子类化Viewport的原因。提供的子类会自动调用setScreenBounds方法来完成它们所声明要做的事情,从而使你的调用变得无用。在同一舞台中使用两个组的缺点是,如果你的游戏世界的相机围绕一个比屏幕大的区域移动,你将会浪费宝贵的填充率来绘制HUD后面的东西。 - Tenfour04
好的,也许我应该多说一些关于我的游戏类型的内容。它是一个单屏幕纸牌游戏,所以不需要滚动。所以,一个类中存在一个方法,我可以用变量调用它,但它什么也不做!?这是怎么回事?我并不是说你错了或者不相信你,恰恰相反,我只是想知道那是如何工作的。所以,如果我重写setbounds,我实际上要在该方法中编写什么代码?是SetPosition还是分别使用setX和setY? - Russ Wheeler
哦,等等。看了一下,你不是想让我覆盖setScreenBounds方法,而只是调用它本身。抱歉,我有点瞌睡了。 - Russ Wheeler
Viewport有三个直接子类,分别是ScreenViewport、ExtendViewport和ScaleViewport。它们都会在其更新方法中间接调用setBounds方法,但只有在从游戏的resize方法中调用update时,Viewport才能正常工作。因此,如果没有进行调整,直接调用setBounds方法并不能真正起到作用。我认为这可能是一个设计错误,或者文档需要更清晰明了。 - Tenfour04
显示剩余3条评论

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