Вторник, 2024-03-19, 9:04 AM

Поиск
Меню
Категории раздела
Поддержи проект!
Рекомендуем


Libgdx приложение

Libgdx позволяет сосредоточиться на нескольких платформах, таких ка Desktop ОС, 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 привязки Lwjgl. Также направлен на 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 реализацию и так далее.