Android 具有两个阶段的Libgdx Hud

Android 具有两个阶段的Libgdx Hud,android,libgdx,stage,hud,Android,Libgdx,Stage,Hud,我有一个应用程序,目前正在与一个单一的阶段,但我需要添加一个侧面显示/部分作为一个平视显示器,分数/生活等,使平视显示器是在左侧,主屏幕的右侧。主游戏屏幕将是固定的,不会移动 通过研究,我找到了一些解决方案 1-两个阶段 2-一个包含两个组的组,可能使用水平组 3-一级两台摄像机 4-一个舞台,一个摄像机,但改变每组演员的摄像机位置 我想,选择1是我的偏好,但我有一些问题 阶段是否总是占据整个屏幕,或者我可以在我想要的地方开始?这将使右侧屏幕更容易根据屏幕的0,0计算位置,而不必总是将HUD的

我有一个应用程序,目前正在与一个单一的阶段,但我需要添加一个侧面显示/部分作为一个平视显示器,分数/生活等,使平视显示器是在左侧,主屏幕的右侧。主游戏屏幕将是固定的,不会移动

通过研究,我找到了一些解决方案

1-两个阶段 2-一个包含两个组的组,可能使用水平组 3-一级两台摄像机 4-一个舞台,一个摄像机,但改变每组演员的摄像机位置

我想,选择1是我的偏好,但我有一些问题

  • 阶段是否总是占据整个屏幕,或者我可以在我想要的地方开始?这将使右侧屏幕更容易根据屏幕的0,0计算位置,而不必总是将HUD的宽度添加到任何计算中
  • 我需要使用视口吗?目前我没有使用一个(我想这意味着我的阶段默认设置为缩放),但是没有任何东西看起来会因此而拉伸。我对视口了解不多,但似乎总是有一种折衷方法,即顶部或侧面的黑色条
  • 如果我有两个阶段,他们每个阶段都有自己的相机吗?我需要跟你谈谈这件事吗?我能不能把右手的相机对准一个偏移量,这样我仍然可以从0,0开始画东西,那是右舞台的左下角,而不是整个屏幕

最后,离题了,我对spritebatch有点困惑。我现在没有用,因为我用的是舞台。这样可以吗,或者我还是应该在舞台上使用它?把我所有的演员都加进去?

如果我理解正确的话,你在游戏世界中使用scene2d,也在HUD中使用scene2d。HUD并不覆盖游戏世界,而是专门使用自己的屏幕部分

阶段并不总是填满整个屏幕。他们没有填充或不填充任何东西的概念,因为他们可以有正在从屏幕上绘制的对象。但是,它们被剪裁到由视口定义的矩形中

在本例中,似乎需要两个视口,因此需要两个阶段。您说您没有使用视口,但您是…Stage会自动创建自己的缩放视口,其设置类似于StretchViewport。(文档中没有提到ScalingViewport,它已经过时。)StretchViewport通常不好,因为您的游戏将被扭曲,以适应设备的纵横比

ExtendViewports不会产生黑条,只要你没有设置它们的最大宽度/高度,我认为它们通常是任何游戏世界视图的最佳选择

您可以设置两个视口以覆盖您自己计算的屏幕的特定部分。由于这是一个特殊情况,我认为您必须直接对Viewport类(不是它的一个子类)进行子类化,并使用
Viewport.setScreenBounds(…)
对每个子类进行操作


关于最后一个问题:是的,两个阶段中的每个阶段都有自己的视口,每个视口都有自己的摄影机。一旦您将两个视口设置为每个都有自己的屏幕部分,您还可以将它们设置为将各自的左下角视为0,0。

(使用默认为我的舞台设置的视口)当我尝试运行setScreenBounds时,不会发生任何更改。我记录了所有的值,它们都改变了,但我的视口仍然能感觉到整个手机屏幕。按照这个速度,我想我将只使用一个阶段和两个组。这个多阶段的事情对我来说毫无意义!是的,这就是为什么我说你必须自己对Viewport进行子类化。所提供的子类会自动调用自己的setScreenBounds,以便执行它们各自声明的操作,从而使调用无效。在一个阶段中使用两个组的缺点是,如果你有一个游戏世界,相机在比你的屏幕大的区域周围移动,你将耗尽HUD后面有价值的填充率绘图内容。好吧,也许我应该添加更多关于我的游戏类型的内容。这是一款单屏纸牌游戏,因此不需要滚动。所以,类中存在一个方法,我可以用变量调用它,但它什么也不做!?这是怎么回事?我不是说你错了,也不是说你不相信,我只是想知道这是怎么回事。那么,如果我重写了setbounds,那么我在该方法中实际要编写什么代码呢?设置位置并分离setX和setY?哦,等等。读过这篇文章后,您并不是想让我重写setScreenBounds方法,而是直接调用它本身。抱歉,这里有三个直接的子类Viewport、ScreenViewport、ExtendViewport和ScaleViewport。它们都间接地从更新方法中调用背景,但只有在从游戏的调整大小方法中调用更新时,视口才能正常工作。所以,这就是为什么直接打电话给挫折者,如果没有欺骗的话,是不会真正起作用的。我认为这可能是一个设计错误,或者文档需要更清楚。