В любой игре присутствует меню. Довольно сложно придумать иной способ навигации. В этой статье рассмотрим как создать свой экран с меню средствами 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.