我在一个屏幕上使用两个阶段。一个 - 用于游戏演员,另一个用于控制按钮等。我使用FitViewport进行游戏阶段。
我应该使用什么功能“调整大小”?像这样:
public void resize(int width, int height) {
FitViewport vpC = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
stageC.setViewport(vpC);
stageC.getViewport().update(width, height, true);
FitViewport vpG = new FitViewport(MyWorld.WIDTH, MyWorld.HEIGHT);
stageG.setViewport(vpG);
stageG.getViewport().update(width, height, true);
}
没有给出正确的结果。
演员失真或按钮没有右坐标。这取决于我在func resize中首先放置的视口 - vpC或vpG。
我应该使用什么正确的方法?
答案 0 :(得分:8)
请再次阅读Viewports wiki article。特别是"用法"一部分。
您不应该在每个resize事件上创建新的视口。这几乎破坏了视口的功能。此外,您当前使用FitViewport
vpC
的方式(请开始使用更好的变量名称),它的行为应该像ScreenViewport
。 FitViewport
有一个"虚拟分辨率"你定义一次。然后在调整大小事件时,更新视口时,它将缩放此虚拟视口以适合屏幕,同时保持纵横比。 (可能会导致黑条)。
如果是UI,Viewport.update(...)
方法的最后一个标志也应该只有true
。你不希望相机在游戏"的情况下居中。 Stage
。
public void show() {
stageC = new Stage(new ScreenViewport());
stageG = new Stage(new FitViewport(MyWorld.WIDTH, MyWorld.HEIGHT));
}
public void resize(int width, int height) {
stageC.getViewport().update(width, height, true);
stageG.getViewport().update(width, height, false);
}
然而还有一个问题。由于您为舞台使用了两种不同的视口缩放策略,因此您需要激活"它们在渲染前单独出现这可以通过对两个阶段使用相同的FitViewport
来避免(最简单的解决方案,可能是您想要的)。
public void render(float deltaTime) {
// this will "activate" the viewport
stageC.getViewport().apply();
stageC.act();
stageC.draw();
// now switch the viewport and activate the other one
stageG.getViewport().apply();
stageG.act();
stageG.draw();
}