2015-03-05 5 views
0

Итак, это слишком сложно для меня, чтобы объяснить это короче, поэтому название выглядит так жутко. Ну, я пишу небольшое приложение для 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() метод в нижней части каждого класса

+0

Вы пробовали переопределить метод onPause? – jvrodrigues

+0

Нет, это не то же самое, что «pause()» - это реализованный метод интерфейса Screen? –

+0

Ах, nvm, не заметил, что вы используете libgdx, подумал, что это просто регулярные действия. – jvrodrigues

ответ

1

Вы должны переместить весь свой код на каждом экране от show() к конструктору. show() вызывается каждый раз, когда экран становится активным экраном, поэтому вы не хотите выполнять инициализацию там.

Кстати, вы никогда не должны держать статические ссылки на все, что реализует Disposable, такое как SpriteBatch, или что-нибудь, что держит ссылку на то, что реализует Disposable, такие как Button или Stage. Если вы это сделаете, когда пользователь отступит от вашей игровой активности и снова откроет его, будут утечки памяти и неправильные текстуры и т. Д.

+0

Это работает! Но когда я переключаю экран # 1 экрана на экран # 2, экран # 1 приостанавливает рендеринг. Спасибо в любом случае и принято! –

+1

Класс игры показывает и отображает только один экран за раз. Если вам нужно другое поведение, вы можете посмотреть исходный код игры и написать свой собственный класс, который немного отличается. – Tenfour04

+0

Хорошо, спасибо еще раз! –

1

Прошло некоторое время с тех пор, как я использовал libgdx, но, похоже, вы создаете новый экран для каждой функции leaveScreen.

См here для лучшего подхода, в котором при создании класса игры вы создаете экраны, а также:

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

В I сказал, что это было какое-то время, но дайте ему выстрел :)

+0

У меня то же самое в классе MyGdxGame, witch btw, также распространяется на Game /. 'открытый класс TinyBattles расширяет игру {' Но танки в любом случае –

Смежные вопросы