切换时屏幕不保存其进度

时间:2015-03-05 14:36:17

标签: android libgdx screen

所以,这对我来说太难解释,所以标题看起来如此令人毛骨悚然。好吧,我正在编写一个小型的Android应用程序,我有三个屏幕:主菜单和两个游戏内屏幕。我可以用开关按钮在最后两个之间切换。问题是,当我切换回我去过的最后一个屏幕时,它的所有表演内容从一开始就重新开始。我也看到了类似的问题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);
        }
    }
}

每个类的底部都有一个leaveScreen()方法

2 个答案:

答案 0 :(得分:1)

自从我使用libgdx以来已经有一段时间了,但似乎你在每个leaveScreen函数上创建了一个新的屏幕。

有关更好的方法,请参阅here,在创建Game类时,您也可以创建屏幕:

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);
        }
    }

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

答案 1 :(得分:1)

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

顺便说一句,你永远不应该对实现Disposable的任何东西(例如SpriteBatch)或任何保留对实现Disposable的东西的引用的东西保持静态引用,例如{ {1}}或Button。如果你这样做,当用户退出你的游戏活动并重新打开它时,就会出现内存泄漏和不正确的纹理等。