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.

  Категории: java, libgdx, Коддинг
  • Lida

    Про архитектуру бы почитать побыстрее)

  • Евгений

    Вам за такие уроки памятник бы поставить. Самое лучшее, что я нашел в интернете.

    • http://suvitruf.ru Suvitruf

      Рад, что кому-то пригодилось)

      • Sasha S.

        Два памяткника тебе :)

  • Леха

    Да-самое лучшее, что я нашел в русском интернете. Впрочем-и на английском нет ничего стоящего.

    • http://suvitruf.ru Suvitruf

      На сайте сообщества много сорсов всяких есть)

      • Леха

        Там больше непринужденный треп на сленге -). А вот что делать пошагово там очень мало имхо. Давайте дальше уроки выкладывайте !

        • http://suvitruf.ru Suvitruf

          Будут, будут уроки )

  • nubideus

    > экраном (иди несколько
    очепятка

    • http://suvitruf.ru Suvitruf

      Спасибо, поправил.

  • SL RU

    СУПЕРРРР!!!! =)

  • Sergey

    Отличные уроки. пытался разобраться с endengine но очень мало хороших уроков. а в статистике движков libgdx выше вот и начал заниматься ейю и тут ваши отличные уроки подвернулись, обычно после кода с уроков еще час нужно сидеть и исправлять а тут нет. Было бы неплохо еще если бы вы подробно описали подключение java doc . я поставил к библиотекам sourse этих библиотек, но ничего не изменилось. Пытался также в в ссылке на javadoc указать пусть http://libgdx.badlogicgames.com/nightlies/docs/api/

    • http://suvitruf.ru Suvitruf

      Хм, вы не первый, кто про проблемы с Java doc пишет. Думаю, стоит статейку тогда написать про это.

  • Ash

    Не могли бы поподробнее про разницу opengl 1 и 2 написать? какие-то проблемы совместимости потом будут? и про powermanager… это что бы экранчик не тух или зачем?)

    • http://suvitruf.ru Suvitruf

      Эм, OpenGL 1.0 и 2.0 довольно сильно отличается. Многие игры на 2.0 не будут работать на некоторых телефонах.

      powermanager да, чтобы экран не потух)

  • Edvard

    super.onCreate(savedInstanceState); – зачем мы вызываем метод супер класса? (плохо знаю джаву, возможно это очевидно для кого-то)

    • http://suvitruf.ru Suvitruf

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

      И это не только к Java относится)

  • Edvard

    p.s. и что такое Bundle savedInstanceState?

    • http://suvitruf.ru Suvitruf

      Bundle используется для сохранения состояния Activity. В случае поворота экрана и т.п.
      Для этого есть события onSaveInstanceState и onRestoreInstanceState.

  • Dima

    Супер уроки)оч понравились