libGDX позволяет сосредоточиться на нескольких платформах, таких как Windows, Linux, Mac OS X, Android и веб браузер. Каждая платформа имеет различные механизмы, когда дело доходит до настройки окна приложения, обработки пользовательского ввода, взаимодействия с файловой системой, проигрыванием и так далее.
Back-end
libGDX пытается абстрагировать эти различия через множество интерфейсов, которые скрывают специфику платформы. Для каждой платформы libGDX поддерживает так называемые back-end и реализует эти интерфейсы. Разработчик приложения не связан с back-end напрямую, вместо этого разработка ведется через интерфейсы.
В настоящее время libGDX поддерживает 4 разных back-end.
- Lwjgl: базируется на библиотеке Lightweight Java Gaming Library, которая является JNI оберткой конкретных оконных инструментов, OpenGL и OpenAL. Этот back-end работает на Windows, Linux и Mac OS X, если предоставлена доступность Java Runtime и видеокарта, поддерживающая как минимум OpenGL 1.5
- Jogl: базируется на Jogl 1.1, еще одна JNI обертка OpenGL и Swing, а также OpenAL. Также направлен на Windows, Linux и Mac OS X. Сейчас Lwjgl более предпочтителен, так как он стабильнее, особенно когда дело доходит до полноэкранных приложений.
- Android: базируется на Android API.
- HTML5: базируется на GWT, SoundManager 2, обновленной GWT WebGL и локальным хранилищем, связанным с Quake 2 GWT. Этот back-end будет компилировать Java код в чистый Javascript код. Конечных проект будет работать в Chrome, Safari, Firefox и последней версии Opera, а так же других браузерах, поддерживающих WebGL. В связи с характером GWT и Javascript, есть некоторые ограничения использования этого back-end.
Модули
В основе ядра libGDX лежит пять интерфейсов предоставляющие, по сути, взаимодействие с операционной системой. Каждый back-end реализует следующие интерфейсы:
- Application: запускает приложение и сообщает API клиенту о событиях уровня приложения, таких как изменение размеров окна. Обеспечивает возможности логирование и запросов, например использование памяти.
- Files: предоставляет лежащею в основе файловую систему платформы. Предоставляет абстракцию различных типов локации файлов на вершине нестандартного дескриптора файла системы (который не взаимодействует с File классом Java)
- Input: информирует API клиента о пользовательском вводе, таким как события мыши, клавиатуры, сенсора или акселерометра. Поддерживается опрос(polling) и обработка событий.
- Audio: Предоставляет средства для воспроизведения звуковых эффектов и потоковой музыки, а так же предоставляет прямой доступ к аудио устройствам для PCM аудио ввода/вывода.
- Graphics: Предоставляет OpenGL ES 1.x и 2.0 (при наличии) и позволяет запрашивать и устанавливать видео режимы и подобные вещи.
Starter классы
Starter класс – код, написанный для конкретной платформы. Back-end предоставляет для каждой платформы фрагмент кода конкретной реализации Application интерфейса. При использовании Lwjgl back-end для настольных компьютеров это может выглядеть примерно так:
public class DesktopStarter { public static void main(String[] argv) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); new LwjglApplication(new MyGame(), config); } }
Для Android соответствующий starter класс может выглядеть следующим образом:
public class AndroidStarter extends AndroidApplication { public void onCreate(Bundle bundle) { super.onCreate(bundle); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); initialize(new MyGame(), config); } }
Эти два класса обычно находятся в отдельных проектах, например в Desktop и Android проектах. Структура этих проектов описана в настройке проекта.
Фактически код приложения находится в классе, который реализует ApplicationListener интерфейс (MyGame в приведенном выше примере). Экземпляр этого класса передается в соответствующие инициализирующие методы каждой back-end Application реализации. Затем в приложении будут вызывать методы ApplicationListener в соответствующее время.
Доступ к модулям
Описанные выше модули могут быть доступны через статические поля Gdx класса. По сути это набор глобальных переменных, которые дают легкий доступ к любому модулю libGDX. В целом это очень плохая практика написания кода, но было решено использовать этот механизм для облегчения головной боли связанной с передачей часто используемых ссылок в различных местах основного кода.
Например, для доступа к аудио модулю можно просто написать следующее:
// creates a new AudioDevice to which 16-bit PCM samples can be written AudioDevice audioDevice = Gdx.audio.newAudioDevice(44100, false);
Gdx.audio является ссылкой back-end реализации, которая была создана Application экземпляром при запуске приложения. Другие модули доступны тем же самым способом, например, Gdx.app - чтобы получить Application, Gdx.files - чтобы получить Files реализацию и так далее.