屏幕切换时不保存进度

Screen does not save its progress when switched

所以,这对我来说太难解释了,所以标题看起来很令人毛骨悚然。好吧,我正在编写一个小型 android 应用程序,我有三个屏幕:一个 main-menu 屏幕和两个 in-game 屏幕。我可以使用切换按钮在最后两个之间切换。问题是,当我切换回我去过的最后一个屏幕时,它所有的动作都从头开始。我也看到了类似的问题here,但我没有为我工作((所以,有什么办法可以保持屏幕渲染,而我正在使用另一个?

谢谢!

第一屏:

public class InGameScreen implements Screen {
    TinyBattles game;

    public static OrthographicCamera camera;

    public static Button switchButton1;

    public InGameScreen(TinyBattles game) {
        this.game = game;
    }

    @Override
    public void show() {
        camera = new OrthographicCamera(Global.VIEWPORT_WIDTH, Global.VIEWPORT_WIDTH*Global.actualHeight/Global.actualWidth);
        camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
        camera.update();

        switchButton1 = new Button();
        switchButton1.create(10, 800, 150, 150);

        Assets.loadSwitchButton();
    }

    @Override
    public void render(float delta) {
        Global.cleanScreen();

        touchHandler(camera, Global.touch);

        switchButton1.act();

        switchButton1.render(Assets.buttonSwitchStateUpSprite, Assets.buttonSwitchStateDownSprite);

        Global.debugRender();
        localDebugRender();

        leaveScreen();

        Global.batch.getProjectionMatrix().setToOrtho2D(0, 0, Global.actualWidth, Global.actualHeight);
        Global.batch.setProjectionMatrix(camera.combined);
        Global.shapeRenderer.setProjectionMatrix(camera.combined);
    }

    public void localDebugRender(){
        switchButton1.debugRender();
    }

    public void touchHandler(OrthographicCamera camera, Vector3 touch){
        if (Gdx.input.isTouched()){
            touch.set(Gdx.input.getX(), Gdx.input.getY(), 0);
            camera.unproject(touch);
            Global.finger.bounds.x = touch.x - 64;
            Global.finger.bounds.y = touch.y - 64;
        }else{
            Global.finger.bounds.x = 10000;
            Global.finger.bounds.y = 10000;
        }
    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {

    }

    public void leaveScreen(){
        if (switchButton1.isPressed == true){
            game.setScreen(TinyBattles.inGameVirtualScreen);
        }
    }
}

第二屏:

public class InGameVirtualScreen implements Screen {
    TinyBattles game;

    public static World world;

    public static OrthographicCamera camera;

    public static Button switchButton2;

    public static Balls balls;

    public InGameVirtualScreen(TinyBattles game) {
        this.game = game;
    }

    @Override
    public void show() {
        world = new World(new Vector2(0, 0), true);

        camera = new OrthographicCamera(Global.VIEWPORT_WIDTH, Global.VIEWPORT_WIDTH*Global.actualHeight/Global.actualWidth);
        camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
        camera.update();

        switchButton2 = new Button();
        switchButton2.create(10, 800, 150, 150);

        balls = new Balls();
        Assets.loadBallSprites();
        balls.create();
        balls.setup();



    }

    @Override
    public void render(float delta) {
        Global.tweenManager.update(1 / 60f);
        Global.cleanScreen();

        world.step(1 / 60f, 10, 10);

        touchHandler(camera, Global.touch);

        switchButton2.act();
        balls.act();

        renderLayerOne();
        renderInterfaceLayer();
        renderDebugLayer();

        leaveScreen();

        Global.batch.getProjectionMatrix().setToOrtho2D(0, 0, Global.actualWidth, Global.actualHeight);
        Global.batch.setProjectionMatrix(camera.combined);
        Global.shapeRenderer.setProjectionMatrix(camera.combined);
    }

    public void renderLayerOne(){
        balls.render();
    }

    public void renderInterfaceLayer(){
        switchButton2.render(Assets.buttonSwitchStateUpSprite, Assets.buttonSwitchStateDownSprite);
    }

    public void renderDebugLayer(){
        Global.debugRender();
        localDebugRender();
    }

    public void localDebugRender(){
        switchButton2.debugRender();
    }

    public void touchHandler(OrthographicCamera camera, Vector3 touch){
        if (Gdx.input.isTouched()){
            touch.set(Gdx.input.getX(), Gdx.input.getY(), 0);
            camera.unproject(touch);
            Global.finger.bounds.x = touch.x - 64;
            Global.finger.bounds.y = touch.y - 64;
        }else{
            Global.finger.bounds.x = 10000;
            Global.finger.bounds.y = 10000;
        }
    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {

    }

    public void leaveScreen(){
        if (switchButton2.isPressed){
            game.setScreen(TinyBattles.inGameScreen);
        }
    }
}

每个class

底部有一个leaveScreen()方法

我使用 libgdx 已经有一段时间了,但您似乎在每个 leaveScreen 函数上都创建了一个新屏幕。

请参阅 here 以了解更好的方法,当您创建游戏时 class 您也创建了屏幕:

public class MyGame extends Game {


        MainMenuScreen mainMenuScreen;
        AnotherScreen anotherScreen;


       @Override
        public void create() {
                mainMenuScreen = new MainMenuScreen(this);
                anotherScreen = new AnotherScreen(this);
                setScreen(mainMenuScreen);              
        }
 }

然后,你把屏幕换成这样:

 public void leaveScreen(){
        if (switchButton2.isPressed){
            game.setScreen(game.anotherScreen);
        }
    }

正如我所说已经有一段时间了,但试一试 :)

您应该将每个屏幕中的所有代码从 show() 移至构造函数。 show() 每次屏幕变为活动屏幕时都会调用,因此您不想在那里进行初始化。

顺便说一下,你永远不应该保留对实现 Disposable 的任何东西的静态引用,例如 SpriteBatch,或者任何保留对实现 Disposable 的东西的引用,例如如 ButtonStage。如果你这样做,当用户退出你的游戏activity并重新打开它时,会出现内存泄漏和不正确的纹理等