捆绑资产 libGDX 依赖
Bundle assets with libGDX dependency
我正在 libGDX 之上为我计划制作的许多类似游戏制作纸牌游戏引擎。以下是我打算如何构建它:每个游戏都是一个单独的项目,引擎是添加到 core
模块的依赖项。引擎本身会有很多资产,比如卡片精灵和其他 UI 元素,它们也需要包含在内。
我怎样才能让这个结构发挥作用?有什么方法可以使依赖项包含其资产吗?另一种方法是为每个游戏复制所有资产,我认为这不是很有效。此外,默认情况下,资产位于 android
模块中,引擎依赖项没有(引擎是单个模块)。资源放在引擎模块的什么地方?
像 libgdx 那样做。类路径中包含资产,例如 arial-15.fnt,它位于 gdx/src/com/badlogic/gdx/utils/ 的核心项目中。看看 BitmapFont
的无参数构造函数是如何引用它的。
我们的设置看起来与您在上面概述的设置类似,其中包含项目与资产的 "many to one" 关系。这是一个可行的方法。
基本思路是:
- 拥有一个权威的资产文件夹
- 让各个项目在构建时将此文件夹复制到它们的构建输出中
- 通过项目的编译任务
dependsOn
或 finalizedBy
复制任务来完成。
- 通过将资产复制到 libgdx 的内部文件 API 寻找特定类型项目的位置,确保 Android 和其他项目满意。 (例如,android 项目会自动在提供给
Gdx.files.internal()
的 URI 前添加一个 assets/
。此步骤更依赖于您的个人文件结构,因此可能需要稍作调整才能获得适用于所有项目的路径,但不要气馁!
旁注:Gradle 应自动跟踪资产目录是否实际更改。如果什么都没有更新,那么复制任务实际上将变成空操作,这会大大加快非首次运行的构建速度。显然,如果您像我在下面提到的那样执行 cleanAssets
,那么这将不适用。
这种方法的优点(无论如何对我来说)是它不再依赖于跨项目链接或时髦的类路径操作。它只是真实目录中的真实文件。缺点是它增加了使用的磁盘space,因为在各种项目中可以有资产的多个物理副本。
以下不是一个完整的示例,但希望能给您足够的帮助。
正在执行的复制任务示例。这个特定的任务从 "core" 项目中获取资产目录并将其复制到 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
}
如果您仍然遇到困难,请告诉我在哪里,我会尽力提供帮助。
我正在 libGDX 之上为我计划制作的许多类似游戏制作纸牌游戏引擎。以下是我打算如何构建它:每个游戏都是一个单独的项目,引擎是添加到 core
模块的依赖项。引擎本身会有很多资产,比如卡片精灵和其他 UI 元素,它们也需要包含在内。
我怎样才能让这个结构发挥作用?有什么方法可以使依赖项包含其资产吗?另一种方法是为每个游戏复制所有资产,我认为这不是很有效。此外,默认情况下,资产位于 android
模块中,引擎依赖项没有(引擎是单个模块)。资源放在引擎模块的什么地方?
像 libgdx 那样做。类路径中包含资产,例如 arial-15.fnt,它位于 gdx/src/com/badlogic/gdx/utils/ 的核心项目中。看看 BitmapFont
的无参数构造函数是如何引用它的。
我们的设置看起来与您在上面概述的设置类似,其中包含项目与资产的 "many to one" 关系。这是一个可行的方法。
基本思路是:
- 拥有一个权威的资产文件夹
- 让各个项目在构建时将此文件夹复制到它们的构建输出中
- 通过项目的编译任务
dependsOn
或finalizedBy
复制任务来完成。 - 通过将资产复制到 libgdx 的内部文件 API 寻找特定类型项目的位置,确保 Android 和其他项目满意。 (例如,android 项目会自动在提供给
Gdx.files.internal()
的 URI 前添加一个assets/
。此步骤更依赖于您的个人文件结构,因此可能需要稍作调整才能获得适用于所有项目的路径,但不要气馁!
旁注:Gradle 应自动跟踪资产目录是否实际更改。如果什么都没有更新,那么复制任务实际上将变成空操作,这会大大加快非首次运行的构建速度。显然,如果您像我在下面提到的那样执行 cleanAssets
,那么这将不适用。
这种方法的优点(无论如何对我来说)是它不再依赖于跨项目链接或时髦的类路径操作。它只是真实目录中的真实文件。缺点是它增加了使用的磁盘space,因为在各种项目中可以有资产的多个物理副本。
以下不是一个完整的示例,但希望能给您足够的帮助。
正在执行的复制任务示例。这个特定的任务从 "core" 项目中获取资产目录并将其复制到 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
}
如果您仍然遇到困难,请告诉我在哪里,我会尽力提供帮助。