Libgdx: 如何 return 到上一个屏幕

Libgdx: how to return to a previous screen

我正在开发一款游戏,在初始阶段我希望用户能够在 two/three 屏幕之间自由切换。
从我在网上看到的情况来看,您可以通过调用游戏实例上的 setScreen 函数来切换屏幕。问题是它似乎只有在您将屏幕的新实例作为参数传递时才有效(我试图将整个屏幕传递给 A 一个新的屏幕 B,但是在 B 上调用 myGame.setScreen(A) 不会't do anything),我想存储用户应用的更改,即使他离开屏幕后也是如此。
我考虑过将这些信息存储在 class 中,每次用户切换屏幕时我都会将其作为参数传递,但这种解决方案似乎效率低下且错误。
是否有任何标准方法可以 return 到前一个屏幕而不丢失对其所做的所有更改? myGame.setScreen 是否仅适用于 Screen 的新实例?

这是我尝试用于 return 旧屏幕的代码:

public class TroopPlacingScreen implements Screen {
private final Game game;
OrthographicCamera camera;
private final GameScreen gameScreen;
private final int XSIZE=1000, YSIZE=500;
private Stage stage;
private long lastClick;
private ImageButton saveAndContinue;

public TroopPlacingScreen(Game game, GameScreen gameScreen){
    this.game=game;
    camera= new OrthographicCamera();
    camera.setToOrtho(false, XSIZE, YSIZE);
    stage= new Stage(new ScreenViewport(), game.batch);
    lastClick= TimeUtils.millis();
    Sprite sprite= new Sprite(new 
         Texture(Gdx.files.internal("saveImage.png")));
    SpriteDrawable spriteDrawable= new SpriteDrawable(sprite);
    saveAndContinue= new ImageButton(spriteDrawable);
    saveAndContinue.setSize(100,100);        
    saveAndContinue.setPosition(Gdx.graphics.getWidth()-250, 
        Gdx.graphics.getHeight()-100);
    stage.addActor(saveAndContinue);
}


@Override
public void show() {

}

@Override
public void render(float delta) {
    ScreenUtils.clear(0, 0, 0, 1);
    camera.update();
    game.batch.setProjectionMatrix(camera.combined);
    game.batch.begin();
    game.batch.end();
    stage.addActor(saveAndContinue);
    if(saveAndContinue.isPressed()){
        game.setFirstTurn(false);
        game.setScreen(gameScreen);
        }
    }
    stage.act();
    stage.draw();
}

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

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {

}
}

正如我所说,这是非常基本的,为了让它工作,我还尝试调用 this.dispose()gameScreen.show()gameScreen.render() 以及这些函数的所有可能排列,当已按下保存并继续按钮,但没有任何效果。

根据您的代码,您将 gameScreen 传递给构造函数但未初始化 class 变量。因此,当调用 game.setScreen(gameScreen); 时,您传递的是 null 而不是实际的屏幕实例。

要让您的代码正常工作,只需在构造函数中初始化您的 class 变量。

this.gameScreen = gameScreen;

此外,最好将屏幕实例保存在 Game class 中并在那里有一个方法,例如setScreen() 将接受屏幕枚举,而不是将屏幕实例泄露给彼此。

public class MyGame extends Game {

    // Make sure to initialize your screens
    private ScreenA screenA;
    private ScreenB screenB;

    /** ... **/

    public void setScreen(ScreenKey screenKey) {
        switch(screenKey) {
            case ScreenKey.A:
                setScreen(screenA);
                break;
            case ScreenKey.B:
                setScreen(screenB);
                break;
        }
    }

    public enum ScreenKey {A, B}
}

那么在ScreenA中可以使用如下语句切换到ScreenB

game.setScreen(ScreenKey.B)

除了 switch 语句,您还可以使用映射 Map<ScreenKey, Screen>.

public class MyGame extends Game {

    // Make sure to initialize your screens
    private Map<ScreenKey, Screen> screens;

    /** ... **/

    public void setScreen(ScreenKey screenKey) {
        setScreen(screens.get(screenKey));
    }

    public enum ScreenKey {A, B}
}