在libgdx中管理桌面和设备版本之间的资源

10

我正在使用libgdx制作一个小型的Android游戏。 现在我在桌面应用程序文件夹和Android应用程序文件夹中都有游戏资产的副本。由于某种奇怪的原因,我必须在这两个版本中以不同的方式访问这些文件。

这在桌面应用程序中正常工作,但在Android应用程序中会引发FileNotFound异常:

Texture texture = new Texture(Gdx.files.internal("assets/someImage.png"));

如果我从文件名中删除 "assets",情况就会反过来(Android可以使用,桌面端崩溃):

Texture texture = new Texture(Gdx.files.internal("someImage.png"));

我不确定问题出在哪里。两个项目的文件夹结构完全相同......用libgdx应该怎么做才是正确的?

6个回答

10
您应该将所有资产存储在Android assets文件夹中,并将桌面项目链接到该文件夹。这个过程的简要说明可以在http://www.badlogicgames.com/wordpress/?p=1537找到。
编辑:官方的项目设置教程也描述了如何执行此操作,可以在http://code.google.com/p/libgdx/wiki/ProjectSetup#Asset_folder_setup找到。
除了项目设置之外,我认为您的第二种方法是正确的方式,可以从两个项目中引用资产。在您修复设置后,它应该在两个环境中正常工作。

9

桌面项目的资源文件夹也可以通过Gradle进行选择- 将以下代码添加到desktop文件夹下的build.gradle文件中:

sourceSets.main.resources.srcDirs = [ "../android/assets/" ]

或者,如果您没有生成Android项目:

sourceSets.main.resources.srcDirs = [ "../core/assets/" ]

当运行eclipse/idea Gradle 任务时,这应该会正确地在Eclipse和IntelliJ中链接文件夹。与创建链接或手动添加文件夹到源代码相比,我认为这是迄今为止最容易设置和管理的方式。


3
搞定了,这应该是被接受的答案。谢谢! - Axel Isouard
1
不确定为什么这个解决方案没有在libgdx官方网站上描述,因为它是最干净的解决方案... - Alex_ES

3

经过大量实验,我发现了一种使它能够运行的方法:

对于 Android 模块,Gdx.files.internal 的根目录是在 Android 资源文件夹中。 对于桌面模块,Gdx.files.internal 的根目录是在顶级项目文件夹中。

因此,如果你在 Android 资源文件夹中的文件或目录下创建一个符号链接,指向你的顶层项目文件夹的下方(即与 android、core、desktop 等文件夹平行),那么 Gdx.files.internal 就可以同时在两个模块中工作。

% cd project
% ln -s android/assets/sound sound
% ln -s android/assets/images images

额外提示 - 如果使用Windows系统,您可以在cmd shell中使用mklink命令来创建这些链接:

mklink /d sound d:\project\android\assets\sound
mklink /d images d:\project\android\assets\images
<注意:Windows无法处理符号链接中的相对路径。另外,您需要以管理员身份运行cmd命令提示符。> <如果您在运行时执行此操作,请确保同步您的文件。>

这是最简单的方法,运行得很好,而且不依赖于IDE。 - Lyoneel

1

libGDX Wiki提取:

资源文件夹设置
Android项目有一个名为assets的子文件夹,这是自动创建的。可以将Android应用程序可用的文件放在这里。然而这种方法存在问题,因为相同的文件也必须对桌面应用程序可用。为了不维护两份文件副本,可以配置桌面项目以查找Android项目中的资源文件夹:

Source选项卡中单击Link Source,单击Browse,选择Android项目中的"assets"文件夹并单击OK
指定"assets"作为文件夹名称,然后单击Finish,再单击OK

注意:如果您的桌面和Android项目位于同一个父文件夹中,则可以使用"PARENT-1-PROJECT_LOC/gamename-android/assets"作为链接资源文件夹的位置,其中"gamename-android"是您的Android项目的名称。如果您计划与他人共享您的项目,这比硬编码路径更好。


0

引用Android资产文件夹并不是一个好主意,因为:

1)Eclipse可能会将您引用的资产文件夹复制到Android项目的apk中,从而使大小翻倍。 2)路径应该是平台无关的。在我看来,这是JogFiles实现问题。

最好将以下类复制到您的类路径中:

package com.badlogic.gdx.backends.jogl; /******************************************************************************* * 版权所有 2011,参见作者文件。 * * 根据 Apache 许可证 2.0 版("许可证")获得许可; * 您不得使用此文件,除非符合许可证的规定。 * 您可以在以下网址获取许可证副本: * * http://www.apache.org/licenses/LICENSE-2.0 * * 除非适用法律要求或书面同意,否则根据许可证分发的软件是基于“原样”分发的, * 没有任何明示或暗示的保证或条件。 * 详见许可证。 ******************************************************************************/ package com.badlogic.gdx.backends.jogl;
import java.io.File;
import com.badlogic.gdx.Files; import com.badlogic.gdx.files.FileHandle;
/** * JoglFiles 类重写了 Gdx 类,以便保持内部文件路径与平台无关。 * Android 在 "assets/" 文件夹中搜索。因此我们在 jogl 中也这样做。 */ final class JoglFiles implements Files { private static final String ASSETS_FOLDER = "assets"; private final String externalPath = System.getProperty("user.home") + "/";
@Override public FileHandle getFileHandle (String fileName, FileType type) { return new JoglFileHandle(fileName, type); }
@Override public FileHandle classpath (String path) { return new JoglFileHandle(path, FileType.Classpath); }
@Override public FileHandle internal (String path) { // 如果路径没有以 "assets/" 前缀开头,则添加前缀。 if (!path.startsWith(ASSETS_FOLDER)) { path = ASSETS_FOLDER + File.separator + path; } return new JoglFileHandle(path, FileType.Internal); }
@Override public FileHandle external (String path) { return new JoglFileHandle(path, FileType.External); }
@Override public FileHandle absolute (String path) { return new JoglFileHandle(path, FileType.Absolute); }
@Override public String getExternalStoragePath () { return externalPath; }
@Override public boolean isExternalStorageAvailable () { return true; } }


0

检查Android资产文件夹中的所有文件名是否都是小写字母


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接