libGDX: Часть 8. Создание меню и переход между экранами

Меню игры

В любой игре присутствует меню. Довольно сложно придумать иной способ навигации. В этой статье рассмотрим как создать свой экран с меню средствами libGDX. Попутно немного о проблеме соотношения сторон на различных устройствах.

Проблема с разрешением экрана

Основная проблема, с которой сталкиваются разработчики игр для платформы Android — неправильное отображение сцены на устройствах с разным соотношением сторон. Если вы посмотрите разрешения на различных устройствах, то обнаружите, что их диапазон довольно большой.

Ладно ещё 720×1280 можно без проблем масштабировать до 360×640. Но простым скалированием не всегда можно решить проблему. Каждый выкручивается по своему. Можно сцену размещать по центру и добавлять фоновые картинки по краям. Или по краю выравнивать, а с другого края фоновое что-то. В моих играх такой проблемы не было, просто видимая часть объектов на различных устройства различалась. На геймплей это не особо сказывалось.

Переключение между экранами

Переключение между экранами в LibGDX довольно простое. Надо вызвать метод setScreen(Screen screen);. То есть в классе игры будут ссылки на все возможные экраны:

public class MyGame extends   Game  {
  public GameScreen game;
  public IntroScreen intro;
	
  @Override
  public void create() {
    game = new GameScreen(this);
    intro = new IntroScreen(this);
    //при запуске игры открываем экран с меню
    setScreen(intro);
}

По сути, создание меню не особо отличается от экрана самой игры. Так же обрабатываем нажатия, рендерим и т.д. Создадим класс IntroScreen, реализовав Screen, InputProcessor. Возьмём за основу решение, которое используется в игре Defender 2. Фон 512×1024 размером. Сама пикча на этом спрайте 480×800. Если экран больше этой картинки, то справа и снизу будет чёрный фон.

Создание меню

Размеры камеры зададим для актуальной картинки фоновой. Всё остальное схоже с игровым экраном.

float CAMERA_WIDTH = 800F;
float CAMERA_HEIGHT = 480F;

Необходимо нарисовать сам фон.

public void showBG(){
  spriteBatch.draw(bgTexture,0, -32, 1024 , 512);
		
}

Поверх него вывести кнопку.

public void showMenu(){
  if(downBtn)
    spriteBatch.draw(textures.get("cover_button_start_down"),653, 183, 256 , 128);
  else
    spriteBatch.draw(textures.get("cover_button_start_up"),653, 183, 256 , 128);
		
}

downBtn показывает нажата ли кнопка или нет. Для красоты анимации, так сказать (: Теперь надо только обработать нажатия.


//обработка нажатия
@Override
public boolean touchDown(int x, int y, int pointer, int button) {

//если нажали на кнопку
  if((height-y)/ppuY >= 213 && (height-y)/ppuY <= 283 && x/ppuX>=660 && x/ppuX<=780)
    //то устанвоим флаг, чтобы при рендеринге нарисовать другой спрайт
    downBtn = true;
		
  return true;
}

//убрали палец с экрана
@Override
public boolean touchUp(int x, int y, int pointer, int button) {
  if (!Gdx.app.getType().equals(ApplicationType.Android))
    return false;
  //если до этого нажали на кнопку
  if(downBtn){
    //чистим ресурсы
    dispose();
    //переходим на экран игры
    game.setScreen(game.game);
  }
			
  downBtn = false;
  return true;
}

В целом работа с меню ничем не отличается от обработки нажатий и отрисовка на игровом экране. Многие меню делают не средствами OpenGL, а не уровне Вьюх. То есть, при запуске игры открывает Activity с лейаутами. С таким меню работать в принципе проще. А уже потом при нажатии на кнопку открывать другое Activity и загружать в нём OpenGL.

Можете скачать исходники урока Libgdxtutorial-lesson8.rar.