libgdx,一个屏幕中的几个阶段

Mic*_*lov 3 android screen stage libgdx

我在一个屏幕上使用两个阶段.一个 - 用于游戏演员,另一个用于控制按钮等.我使用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);

}
Run Code Online (Sandbox Code Playgroud)

没有给出正确的结果.

演员失真或按钮没有右坐标.这取决于我在func resize中首先放置的视口 - vpC或vpG.

我应该使用什么正确的方法?

noo*_*one 8

请再次阅读Viewports wiki文章.特别是"用法"部分.

您不应该在每个resize事件上创建新的视口.这几乎破坏了视口的功能.此外,您当前使用FitViewportfor的方式vpC(请开始使用更好的变量名称),它应该表现得像ScreenViewport.FitViewport有一个你定义一次的"虚拟分辨率".然后在调整大小事件时,更新视口时,它将缩放此虚拟视口以适合屏幕,同时保持纵横比.(可能会导致黑条).

Viewport.update(...)方法的最后一个标志也应仅true在UI的情况下.在"游戏"的情况下,您不希望相机居中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);
}
Run Code Online (Sandbox Code Playgroud)

但是还有一个问题.由于您为舞台使用了两种不同的视口缩放策略,因此需要在渲染之前单独"激活"它们.这可以通过在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();
}
Run Code Online (Sandbox Code Playgroud)