gpt4 book ai didi

java - LibGDX FitViewport 正确调整大小,但在更改屏幕后重置

转载 作者:太空宇宙 更新时间:2023-11-04 13:27:09 25 4
gpt4 key购买 nike

我在 LibGDX 中使用 FitViewport 时遇到问题。调整窗口大小时,一切正常。接下来,我切换屏幕,所有内容都会翻转回正常尺寸,并且图像被裁剪到左侧,而应用程序的尺寸保持调整大小。

调整大小后,FitViewport 工作正常: Resized window, no problems

但是,当我按下到第一个屏幕按钮时,就会发生这种情况:

Next screen, resizing fails

因此,除了缩放按钮和图像的位置之外,一切正常(按到主屏幕按钮可返回原始屏幕)。

窗口的尺寸保持不变,但图像恢复到其原始大小(500x500)并放置在坐标(0,0)处。

关于如何解决这个问题有什么想法或建议吗?我正在为这个问题绞尽脑汁,似乎无法正确处理...我希望它就像第一个屏幕一样。

<小时/>

这些是我的类文件:我使用抽象 Screen 类来跟踪屏幕(并用于稍后扩展)和 ScreenManager:

主类:

public class MainClass implements ApplicationListener {

@Override
public void create () {
ScreenManager.setScreen(new MainScreen());
}

@Override
public void render () {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

if (ScreenManager.getCurrentScreen() != null) {
ScreenManager.getCurrentScreen().render();
}
}

@Override
public void resize(int width, int height) {
if (ScreenManager.getCurrentScreen() != null)
ScreenManager.getCurrentScreen().resize(width, height);
}
}

抽象屏幕类:

public abstract class Screen {

public abstract void create();

public abstract void render();

public abstract void resize(int width, int height);

public abstract void pause();

public abstract void dispose();

public abstract void resume();
}

屏幕管理器类:

public class ScreenManager {

private static Screen currentScreen;

public static void setScreen(Screen screen) {
if (currentScreen != null)
currentScreen.dispose();
currentScreen = screen;
currentScreen.create();
}

public static Screen getCurrentScreen() {
return currentScreen;
}
}

主屏幕类:

public class MainScreen extends Screen {

private Texture bg1;
private Image bg1Image;
private Skin skin;

private Stage stage;
private OrthographicCamera camera;
private FitViewport fitViewport;

@Override
public void create() {
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
fitViewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera);

bg1 = new Texture(Gdx.files.internal("background1.png"));
bg1Image = new Image(bg1);
skin = new Skin(Gdx.files.internal("uiskin.json"));

TextButton nextButton = new TextButton("to first screen", skin);
nextButton.setPosition(200, 200);
nextButton.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
ScreenManager.setScreen(new FirstScreen());
super.clicked(event, x, y);
}
});

stage = new Stage(fitViewport);
stage.addActor(bg1Image);
stage.addActor(nextButton);

Gdx.input.setInputProcessor(stage);
}

@Override
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

stage.act(Gdx.graphics.getDeltaTime());

fitViewport.apply();
stage.draw();
}

@Override
public void resize(int width, int height) {
fitViewport.update(width, height, true);
camera.update();
}
}

第一屏幕类(class):

public class FirstScreen extends Screen {

private Texture bg2;
private Image bg2Image;
private Skin skin;

private Stage stage;
private OrthographicCamera camera;
private FitViewport fitViewport;

@Override
public void create() {
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
fitViewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera);

bg2 = new Texture(Gdx.files.internal("background2.png"));
bg2Image = new Image(bg2);
skin = new Skin(Gdx.files.internal("uiskin.json"));

TextButton prevButton = new TextButton("to main screen", skin);
prevButton.setPosition(200, 200);
prevButton.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
ScreenManager.setScreen(new MainScreen());
super.clicked(event, x, y);
}
});

stage = new Stage(fitViewport);
stage.addActor(bg2Image);
stage.addActor(prevButton);

Gdx.input.setInputProcessor(stage);
}

@Override
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

stage.act(Gdx.graphics.getDeltaTime());

fitViewport.apply();
stage.draw();
}

@Override
public void resize(int width, int height) {
fitViewport.update(width, height, true);
camera.update();
}
}

(我知道我提供了很多类(class),但我想详细解释所有内容......)我猜这可能是一件小事,但我似乎无法把它做好,这让我发疯......任何帮助或建议将不胜感激!

最佳答案

您的问题在这里:

    camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
fitViewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera);

每次检查当前窗口大小并创建具有窗口大小的视口(viewport)时。解决方案是手动定义窗口大小并根据该值创建新的屏幕视口(viewport)。

在您的主类中创建静态公共(public)大小变量(您当然可以在您想要或不创建的任何地方创建它,但直接写入值 - 但这由于将来的重构而不好)

    public static final float WIDTH = 800, HEIGHT = 600; //or any other values you need

然后创建你的视口(viewport)和相机,就像

    camera = new OrthographicCamera(Main.WIDTH, Main.HEIGHT);
camera.setToOrtho(false, Main.WIDTH, Main.HEIGHT);
fitViewport = new FitViewport(Main.WIDTH, Main.HEIGHT, camera);

仅此而已。

<小时/>

如果您不需要这个相机,也请考虑不要创建新相机 - 也许默认的舞台相机对您来说就足够了?想一想。

关于java - LibGDX FitViewport 正确调整大小,但在更改屏幕后重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32528989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com