Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Объединение ресурсов с зависимостью от libGDX

Автор вопроса: NicolasОтветов: 2

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

Как я могу заставить эту структуру работать? Есть ли способ заставить зависимость включать свои активы? Альтернативой является дублирование всех активов для каждой игры, что я не считаю очень эффективным. Также активы по умолчанию находятся в модуле android, которого нет в зависимости от движка (движок представляет собой один модуль). Где разместить активы в модуле движка?

  • Является ли ваш проект проектом Gradle, созданным с помощью генератора проектов LibGDX? Fooble 01.02.2019
  • Проект движка - это всего лишь один модуль, но игры, в которые включен движок, - это проекты, сгенерированные с помощью генератора проектов. (оба основаны на Gradle) Nicolas 01.02.2019
  • Глядя на эту страницу, я думаю, вы сможете хранить изображения в виде файла Classpath. github.com/libgdx/libgdx/wiki/File-handling Вам нужно только они должны быть доступны только для чтения, и они не являются игровыми активами, они являются частью вашего движка. Fooble 01.02.2019
  • @Fooble Спасибо, похоже, что-то может сработать. Я попробую это завтра. Nicolas 01.02.2019
  • Другим вариантом было бы отказаться от включения ресурсов в движок и импортировать атлас скинов и текстур. Таким образом, элементы могут иметь одинаковые имена, но различаться от игры к игре. github.com/libgdx/libgdx/wiki/Skin github.com/libgdx/libgdx/wiki/Texture-packer#textureatlas Fooble 01.02.2019
  • Что вы имеете в виду, говоря, что движок импортирует атлас текстур? Будет ли он импортирован автоматически? Nicolas 01.02.2019

dependencieslibgdxproject-structure

Ответы

Ответ 1 · рейтинг 1 · Harvtronix

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

Основная идея:

  1. Иметь единую авторитетную папку активов
  2. Попросите отдельные проекты скопировать эту папку в свои выходные данные сборки во время сборки.
  3. Добейтесь этого, создав задачу компиляции проекта dependsOn или finalizedBy задачу копирования.
  4. Убедитесь, что Android и другие проекты довольны, скопировав активы в то место, где внутренние файловые API libgdx ищут этот конкретный тип проекта. (Например, проекты Android автоматически получают assets/ перед URI, предоставленным Gdx.files.internal(). Этот шаг больше зависит от вашей личной файловой структуры, поэтому может потребоваться небольшая настройка, чтобы получить правильный путь для всех проектов, но не получайте обескуражен!

Примечание: Gradle должен автоматически отслеживать, действительно ли изменился каталог ресурсов. Если ничего не обновлялось, то задачи копирования фактически станут неоперативными, что немного ускорит сборку для не первых запусков. Очевидно, что если вы сделаете cleanAssets, как я упоминаю ниже, это не будет применяться.

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

Следующий пример не является полным, но мы надеемся, что он даст вам достаточно информации.

Пример задачи копирования в действии. Этот конкретный пример берет каталог ресурсов из "основного" проекта и копирует его в проект Android.

android/build.gradle

task copyAssets(type: Copy) {
    from "../core/assets"
    into "./assets"
}

Пример того, как сделать сборку проекта Android зависимой от этой задачи:

android/build.gradle

afterEvaluate { project ->
    project.tasks.preDebugBuild {
        dependsOn copyAssets
    }

    project.tasks.preReleaseBuild {
        dependsOn cleanAssets
        finalizedBy copyAssets
    }
}

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

Пример зависимости задачи копирования для проекта, отличного от Android:

build {
    finalizedBy copyAssets
}

Если вы все еще застряли, дайте мне знать, где, и я постараюсь помочь.

Ответ 2 · рейтинг 1 · MrStahlfelge

Делайте это так, как это делает сама libgdx. В путь к классам включены активы, такие как arial-15.fnt, который находится в основном проекте по адресу gdx/src/com/badlogic/gdx/utils/. Взгляните на конструктор без параметров BitmapFont, как на него ссылаются.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы