Показаны сообщения с ярлыком libgdx. Показать все сообщения
Показаны сообщения с ярлыком libgdx. Показать все сообщения

libGDX - фреймворк для разработки игр


libGDX – кроссплатформенный фреймворк для разработки игр и визуализации, основанный на языке программирования Java с некоторыми компонентами, написанными на C и C++ для повышения производительности определенного кода. В настоящее время поддерживает Windows, Linux, Mac OS X, Android, iOS и HTML5 как целевые платформы.

libGDX позволяет вам написать код однажды и затем развертывать игру или приложение на нескольких платформах без модификации. Вы можете разрабатывать приложение на основном компьютере и получать огромную выгоду быстрой разработки, вместо того, чтобы ждать, когда последние изменения буду внедрены и установлены на устройство и будут скомпилированы в HTML5. Вы можете использовать все инструменты Java, чтобы быть продуктивным, насколько это возможно.

9-Patch изображения

Данная статья рассматривает 9-patch изображения, как их можно создать и как их использовать в контексте libGDX приложения.

Упаковщик текстур

В OpenGL привязывается текстура и делается визуализация, затем привязывается другая текстура и делается еще дополнительная визуализация и так далее. Привязывание текстуры является относительно дорогим, поэтому идеальным считается хранение большого числа маленьких изображений на одном большом изображении, привязывание один раз большой текстуры, а затем многократная визуализация отдельных частей. libGDX имеет класс TexturePacker, который представляет собой приложение командной строки для упаковки множества маленьких изображений в одно большое. Он хранит местоположение маленьких изображений, так что в приложении на них можно легко сослаться по имени, используя класс TextureAtlas.

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

Рефлексия

Для того, чтобы использовать рефлексию кроссплатформенный образом, libGDX предоставляет небольшую обертку вокруг API рефлексии Java. Данная обертка в основном состоит из двух классов, содержащих статические методы, которые вы будете вызывать для операций рефлекции:

  • ArrayReflection – инкапсулирует доступ к java.lang.reflect.Array.
  • ClassReflection – инкапсулирует доступ к java.lang.Class.

Другие классы, включенные в обертку, предоставляют доступ к конструкторам, методам и полям. Данные классы (по большей части) отражают их java.lang.reflect эквивалент и могут быть использованы таким же образом.

Гироскоп

Некоторые Android устройства имеют такой датчик как гироскоп, который предоставляет информацию о скорости вращения в радианах в секунду вокруг оси X, Y и Z для устройства.

Примечание: Гироскоп в настоящее время не доступен на устройствах с iOS, так как нет реализации в RoboVM.

Сначала вы должны включить гироскоп в вашей Android конфигурации. Как правило, в файле AndroidLauncher.java.

config = new AndroidApplicationConfiguration();
config.useGyroscope = true;  // по умолчанию false

// вы возможно захотите отключить датчики, которые включены по умолчанию, если они больше не будут нужны
config.useAccelerometer = false;
config.useCompass = false;

Запрос доступен ли гироскоп работает следующим образом:

boolean gyroscopeAvail = Gdx.input.isPeripheralAvailable(Peripheral.Gyroscope);

После того как вы определили, что гироскоп действительно доступен, вы можете опросить состояние:

if (gyroscopeAvail) {
    float gyroX = Gdx.input.getGyroscopeX();
    float gyroY = Gdx.input.getGyroscopeY();
    float gyroZ = Gdx.input.getGyroscopeZ();
}

libGDX 1.6.4

libGDX 1.6.4

Время нового релиза, а также появилась новая версия RoboVM. Подробнее об этом ниже.

  • TextField курсор и размер выделение изменены, смотрите коммит.
  • FreeTypeFontGenerator настройки для улучшения теней и границ.
  • ScrollPane плавная прокрутка когда область прокрутки намного больше чем полосы прокрутки.
  • TexturePacker сортирует страницы регионов по именам.
  • GlyphLayout перенос текста изменен чтобы не обрезать пустое пространство, смотрите коммит.
  • Исправление BitmapFont вычисления ширины пространства, когда используется отступ и нет пространства глифа в шрифте.
  • Исправление TextArea курсора и рисования выделенных позиций.
  • Исправление ActorGestureListener панорамирования и масштабирования когда актер вращается или масштабируется.
  • Исправление TextField для отображения не пикселей.
  • Для Label допускается установка многоточия строки.
  • AssetManager получает перехват для обработки сбоя при загрузки.
  • TextField теперь вызывает событие ChangeEvent когда изменяется текст, можно тоже отменить.
  • Добавлены всплывающие подсказки к scene2d.ui.
  • Обновлен RoboVM до версии 1.5

Как всегда обновите проект, также обновите RoboVM Eclipse или IntelliJ IDEA плагин до версии 1.5.0!

Наконец RoboVM выпустили RoboVM Studio для Mac OS X, отличный способ делать кросс-платформенные приложения.

libGDX 1.6.3

libGDX 1.6.3

Новый релиз, вот изменения:

  • Обновлен RoboVM до версии 1.4.0.

Как всегда обновите проект, также обновите RoboVM Eclipse или IntelliJ IDEA плагин до версии 1.4.0!

libGDX 1.6.2

libGDX 1.6.2

Время нового релиз, вот изменения:

  • API Изменение: TiledMap ImageLayer теперь использует для позиционирования float вместо int.
  • API Изменение: добавлен GLFrameBuffer и FrameBufferCubemap: Framebuffer теперь наследуется от GLFramebuffer, смотрите #2933.

Как всегда обновите проект, также обновите RoboVM Eclipse или IntelliJ IDEA плагин до версии 1.3.0!

Говоря про RoboVM, теперь реализовано избегание компилятором генерации кода, который никогда не используется. Это делает ваше приложение намного меньше. Также это означает, что время компиляции теперь более быстрое, так что время итерации ниже! Смотрите подробнее о релизе RoboVM 1.3.

libGDX 1.6.1

libGDX 1.6.1

Этот релиз содержит значительные изменения в системе сборки. iOS нативные библиотеки, например, gdx код, freetype, bullet или box2d теперь упаковываются с использованием RoboVM Jar схемы для нативных библиотек. Статические библиотеки хранятся внутри jar файла в директории META-INF/robovm/ios/libs. Кроме того, небольшой файл robovm.xml хранится в META-INF/robovm/ios/robovm.xml, этот файл описывает нативные библиотеки в libs директории которую должен связать RoboVM.

Если вы обновили существующий проект до версии libGDX 1.6.1, то вам нужно сделать несколько изменений в build.gradle и ios/build.gradle файлах вашего проекта!

В корневом build.gradle файле для iOS проекта вы увидите что-то подобное:

project(":ios") {
    apply plugin: 'java'
    apply plugin: 'robovm'

    configurations { natives }

    dependencies {
        compile "org.robovm:robovm-rt:${roboVMVersion}"
        compile "org.robovm:robovm-cocoatouch:${roboVMVersion}"
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
    }
}

libGDX 1.6.0

libGDX 1.6.0

Время нового релиза

  • API Изменение: GlyphLayout xAdvances теперь с дополнительной записью в замом начале. Это было необходимо для реализации плотной границы текста #3034
  • API Изменение: Label#getTextBounds изменен на getGlyphLayout.
  • API Изменение: BitmapFont метрики теперь принимают во внимание отступы #3074.
  • API Изменение: метод PixmapPacker.generateTextureAtlas(…) теперь возвращает атлас, который может быть обновлен последующим вызовом PixmapPacker.updateTextureAtlas(…).
  • API Изменение: метод FreeTypeFontGenerator.generateFont(…) теперь работает с предоставленным пользователем PixmapPacker.
  • Добавлены DirectionalLightsAttribute, PointLightsAttribute и SpotLightsAttribute, удалены Environment#directionalLights/pointLights/spotLights, добавлен Environment#remove, свет теперь стал таким же как и другие атрибуты. Смотрите также https://github.com/libgdx/libgdx/wiki/Material-and-environment#lights
  • Добавлена ​​возможность извлечения аннотации метода к Reflection API.
  • Добавлена ​​возможность упаковать "анонимные" pixmaps в PixmapPacker, которые появится в сгенерированной текстуре, но не в сгенерированном или обновленном TextureAtlas.
  • Добавлен метод PixmapPacker.updateTextureRegions().
  • Добавлен метод ​​PixmapPacker.packDirectToTexture().
  • Добавлен метод AnimatedTiledMapTile.getFrameTiles().
  • В 2D ParticleEditor все точки диаграммы можно перетаскивать сразу, удерживая клавишу Ctrl. Точки можно тянуть пропорционально, удерживая Ctrl-Shift.
  • В 2D ParticleEditor добавлена ​​кнопка Merge для объединения загруженного файла эффекта частицы с текущем открытым эффектом частицы.
  • Обновление обертки Bullet до версии 2.83.

Убедитесь, что RoboVM Eclipse плагин обновлен до версии 1.2.0! Теперь также существует RoboVM IntelliJ IDEA плагин!

Смотрите статью о том, как обновить libGDX проект до последней версии. Текущая версия libGDX "1.6.0", текущая nightly версия "1.6.1-SNAPSHOT". Вы можете посетить страницу версий с описанием всех деталей версий зависимостей.

Интерполяция

Обычно известна как промежуточные кадры, интерполяция полезна для генерирования значений между двумя дискретными конечными точками, используя различные функции кривой. Часто используемая в анимации с ключевыми кадрами,интерполяция позволяет аниматору описать набор явных кадров для анимации и затем сгенерировать вычислением плавный переход между этими кадрами. Самая простая форма интерполяции – линейная интерполяция, которая доступна в Vector2 (код) и Vector3 (код) классах. Класс Interpolation (код) предоставляет более интересные результаты, используя нелинейные функции кривой, интерполируя значения.

Математические утилиты

Пакет math содержит различные полезные классы для решения проблем в геометрии, линейной алгебры, обнаружении столкновений, интерполяции и в преобразованиях общих единиц.

Класс MathUtils (код) охватывает целый ряд полезных мелочей. Существует удобное статическое поле класса Random, чтобы в вашем коде избегать создания его экземпляра. Использование в коде того же random экземпляра может обеспечить последовательное детерминированное поведение, поскольку храниться использованное seed значение. Предоставляются константы для преобразования между радианами и градусами также как таблица поиска функций синуса и косинуса. Чтобы избегать приведения типа к double существуют float версии общих java.lang.Math функций.

Сжатие текстур

Если вам нужно сжатие текстур, офлайн генерация MIP-текстурирования или кубическая карта, то такого формата текстур по умолчанию как PNG не будет достаточно. К счастью libGDX предоставляет для этого два варианта – ETC1 файлы и KTX/ZKT текстуры.

Заметим, что в настоящее время ETC1 и KTX/ZKTX не поддерживаются для GWT бекэнда.

Перед тем как вдаваться в подробности, нужно знать, что существует два типа сжатия:

  • Сжатие, используемое для хранения текстуры на диске (zip, png, jpg, ...), которое является полезным для уменьшения размеров вашего пакета приложения.
  • Сжатие, используемое для хранения текстуры в памяти (ETC1, ETC2, S3TC, ...), которое улучшает производительность игры и минимизирует память приложения во время выполнения (отсюда уменьшение риска, что Android выполнить перезапуск приложения при resume событии).

OpenGL ES 2.0 имеет только один обязательный формат сжатия текстуры: ETC1. Он позволяет уменьшить размер любого RGB8 изображения в шесть раз. Основной недостаток в том, что он является форматом сжатия с потерями. Другой недостаток, что он ограничен RGB8. Для поддержки альфа канала вы должны хранить альфу отдельно:

  • В другой текстуре, которая может быть так же ETC1
  • В той же текстуре, размещая цветовую часть вашего изображения вверху, и альфа часть внизу.

Экономия видео памяти упадет с 6x до 4x, но это все же стоит усилий. Пример приведен в KTXTest.

Карты тайлов

libGDX предоставляет общий API для карт. Все классы для работы с картами можно найти в com.badlogic.gdx.maps (исходный код) пакете. В корне пакета содержатся базовые классы, дочерние пакеты содержат специализированные реализации для карт тайлов и других форм карт.

Базовые классы

Набор базовых классов предназначен быть общим, чтобы мы имели поддержку не только карт тайлов, но любых форматов 2D карт.

Карта представляет собой набор слоев. Каждый слой содержит набор объектов. Карты, слои, и объекты имеют свойства, зависящие от формата, из которого они были загружены. Для некоторых форматов существуют специальные реализации карт, слоев и объектов, но об этом чуть позже. Иерархия базовых классов выглядит следующим образом:

2D Анимация

2D анимация – техника, используемая для создания иллюзии движения, используя статические изображения. Данная статья описывает, как создать анимацию в libGDX приложении.

Окна просмотра

Когда в libGDX игре вы имеете дело с различными экранами, то часто для определенной стратегии необходимо решить, как будут обрабатываться эти экраны. Camera и Stage поддерживают разные стратегии для окна просмотра, например, когда используется метод Camera.project(vec, viewportX, viewportY, viewportWidth, viewportHeight).

libGDX предоставляет более удобный способ решения этой проблемы, а именно с помощью разных окон просмотров – Viewport.

Профилирование

Данная статья описывает небольшие вспомогательные инструменты и утилиты libGDX, которые могу пригодиться в случае, если вы сталкиваетесь с проблемами производительности и необходимо начать профилирование libGDX игры или приложения.

Создание скриншота

Данный пример показывает, как в libGDX сделать скриншот или так называемый снимок экрана, и сохранить его в PNG формате с добавлением суффикса в случае, когда делается несколько скриншотов.

public class ScreenshotFactory {

    private static int counter = 1;
    public static void saveScreenshot(){
        try{
            FileHandle fh;
            do{
                fh = new FileHandle("screenshot" + counter++ + ".png");
            }while (fh.exists());
            Pixmap pixmap = getScreenshot(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
            PixmapIO.writePNG(fh, pixmap);
            pixmap.dispose();
        }catch (Exception e){
        }
    }

    private static Pixmap getScreenshot(int x, int y, int w, int h, boolean yDown){
        final Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(x, y, w, h);

        if (yDown) {
            // Переворачиваем изображение, так как оно должно храниться в перевернутом формате.
            ByteBuffer pixels = pixmap.getPixels();
            int numBytes = w * h * 4;
            byte[] lines = new byte[numBytes];
            int numBytesPerLine = w * 4;
            for (int i = 0; i < h; i++) {
                pixels.position((h - i - 1) * numBytesPerLine);
                pixels.get(lines, i * numBytesPerLine, numBytesPerLine);
            }
            pixels.clear();
            pixels.put(lines);
        }

        return pixmap;
    }
}

Использование скриншотов для создания видео

Скриншоты также могут быть использованы для создания видео, без потери, путем создания скриншота для каждого кадра и использования программ для преобразования PNG файлов в видео.

Пример видео

В Linux, это можно сделать с помощью FFmpeg.

ffmpeg -i screenshot%d.png -r 60 -sameq -vcodec mpeg4 output.avi

Для повышения производительности, вовремя создания скриншотов, их можно хранить в памяти, как массив или коллекцию, и записывать большими группами. Очевидно, что такой подход требует больших объемов доступной памяти, в зависимости от размера PNG и количества скриншотов для одной группы. Это хороший метод для записи только нескольких секунд видео геймплея, без больших замедлений игры из-за файловых операций ввода-вывода.

Обзор libGDX модулей

Введение

libGDX включает в себя несколько модулей, которые предоставляют сервисы для каждой ступени в архитектуре игры.

  • Ввод – предоставляет унифицированную модель ввода и обработчик для всех платформ. Поддерживает клавиатуру, сенсорный экран и где доступно акселерометр и мышь.
  • Графика – позволяет отображать изображения на экране, используя аппаратную реализацию OpenGL ES.
  • Файлы – предоставляет удобные методы для операций чтения и записи данных, посредством абстрактного файлового доступа на всех платформах.
  • Аудио – облегчает запись и воспроизведение звука на всех платформах.
  • Сеть – предоставляет методы для выполнения сетевых операций, таких как HTTP GET/POST запросы, и коммуникации между TCP сокетами сервера и клиента.

Модуль графики

Модуль графики в libGDX скрывает сложности, которые возникают при программировании графики, используя OpenGL ES API. Модуль предоставляет удобные методы для получения экземпляров OpenGL ES оберток, независимо от платформы.

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

Хотя главный интерфейс модуля графики предоставляет методы, относящиеся к вышеупомянутой функциональности, он на самом деле гораздо больше. Модуль содержит набор классов, которые делают разработку графики в libGDX предельно простой. Он облегчает программирование 2D и 3D графики посредством множества высокоуровневых и низкоуровневых возможностей и реализаций классов, наиболее общих объектов, используемых в играх.