libgdx: переключение между экранами

В любой игре есть меню, из которого вы уже попадаете на игровой экран. В общем-то различных экранов может быть много. Можно, конечно, полностью перерисовывать всё, когда необходимо переключение между экранами. В libgdx всё намного проще оказалось.

В обычном приложении под Android переключение между активностями довольно просто:

Intent intent = new Intent(); 
intent.setClass(this, MyActivity.class); 
startActivity(intent); 

Я первоначально и хотел что-то подобное и для игры сделать. Для каждого экрана своё Activity. А потом уже переключаться между ними. Оказалось, что всё куда проще. Activity у меня всего одно:

public class MainActivity extends AndroidApplication {
    /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
    config.useAccelerometer = false;
    config.useCompass = false;
    config.useWakelock = true;
    config.useGL20 = true;
    initialize(new BomberMan(), config);
    }
}

Как видно, в нём создаётся экземпляр BomberMan, который наследуется от класса Game:

public class BomberMan extends  Game {
  public StageScreen stage;
  public GameScreen game;

  @Override
  public void create() {
    stage = new StageScreen(this);
    game = new GameScreen(this);
    setScreen(stage);		  
  }
  
  ...
}

Класс содержит ссылки на все доступные экраны. В случае необходимости можно переключится. GameScreen и StageScreen реализуют интерфейсы класса Screen. Как пример, при клике хотим переключить экран:

public class StageScreen implements Screen, InputProcessor {
  BomberMan game;

  //в конструктор передаём ссылку на BomberMan
  public StageScreen(BomberMan game){
    this.game = game;
  }

  //при нажатии на тач
  @Override
  public boolean touchDown(int x, int y, int pointer, int button) {
    //меняем экран
    game.setScreen(game.game);
    return true;
  }
  ...
}

Довольно просто и удобно. Не обязательно создавать экземпляры всех экранов, можно только один. А уже при переключении создавать экземпляр того экрана, куда хотим перейти. Я лично считаю, что лучше подгрузить всё сразу при запуске игры, чтобы потом при переключении между экранами юзеру не пришлось ждать (: