libGDX: Часть 1. Жизненный цикл игры

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

Android основан на Linux. Между приложением и ядром лежит слой API и слой библиотек на нативном коде. Приложение выполняется на виртуальной машине Java (Dalvik Virtual Machine). В Android можно запускать несколько приложений, одно из которых будет главным и займёт весь экран. Между приложениями можно переключаться (они представлены на странице «Последние запущенные приложения»).

Каждый экран пользовательского интерфейса представлен классом Activity в коде.

Application/AndroidApplication

Главная точка входа любого приложения libGDX. Application определяет целевую платформу и графические бэкэнды, которые будут использоваться в приложении. Это так же дает доступ к общему Log-модулю, который работает на всех платформах. ApplicationListener должен быть реализован первым при создании libGDX приложения.

В введении мы создали класс MyGame, он и является этим самым Application Listener.

Application Listener/Game

Вспомните public class MyGame extends Game. Наш класс наследуется от Game, который реализует интерфейсы Application Listener.

Application Listener отвечает за инициализацию приложения, обновление игрового процесса (то есть игровой логики), отображение изображений, установка паузы игры, сохранение состояния приложения и выгрузку ресурсов при выходе из приложения.

Это та часть, где происходит обработка событий жизненного цикла приложения. Каждое приложения или игра, независимо от бэкэндов либо целевой платформы, реализует ApplicationListener интерфейс. Он реализуется одинаково для всех платформ.

Жизненный цикл приложения

В своём классе, если это необходимо, вы можете эти методы переопределить:

public class MyGame extends   Game  {
	
	@Override
	public void create() {
	}
	
	@Override
	public void resize(int width, int height) {		
	}

	@Override
	public void render() {
	}

	@Override
	public void pause() {		
	}

	@Override
	public void resume() {		
	}

	@Override
	public void dispose() {	
	}
	
}

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

resize(int width, int height) — вызывается каждый раз, когда приложение меняет размер и оно не находится в состоянии паузы. Так же данный метод вызывается однажды, сразу после вызова метода create(). Передаваемые параметры ширины и высоты меняются в зависимости от размера окна так же каждый раз при вызове метода.

render() — вызывается каждый раз, когда происходит отрисовка экрана. Вызывается непрерывно, пока мы не решим, что игра закончена. По сути, является сердцем игры (:

pause() – вызывается прежде чем приложение будет закрыто. В Android это происходит, когда нажимается кнопка “Home” или поступает входящий вызов. В desktop-приложениях метод вызывается перед вызовом метода dispose() при закрытии приложения. Обычно в этом методе сохраняют состояние приложение, потому что не факт, что к нему ещё вернуться.

resume() – вызывается при получении фокуса приложением.

dispose() – вызывается при закрытии приложения (после метода pause()). Здесь можно подчистить за собой мусор, который не почистить за вас сборщик.

Напомню метод onCreate в MainActivity:

@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 MyGame(), config);
    }

С useAccelerometer и useCompass всё ясно.

useWakelock — используется ли PowerManager. В прошлой статье для этого разрешение добавляли в манифест приложения.

useGL20 — флаг, указывающию, используется ли OpenGL ES 2. Если true – используeтся OpenGL ES 2, если false – используется OpenGL 1.x.