我正在使用libgdx构建一个小型Android游戏。 现在我在桌面项目文件夹和Android项目文件夹中有一个游戏资产的副本。出于某些奇怪的原因,我必须在两个版本中以不同方式访问这些文件。
这在桌面应用程序中工作正常,但在android应用程序中给我一个FileNotFound异常:
Texture texture = new Texture(Gdx.files.internal("assets/someImage.png"));
如果我从文件名中删除“资产”,则反之亦然(Android工作,桌面崩溃):
Texture texture = new Texture(Gdx.files.internal("someImage.png"));
我不确定问题是什么。两个项目的文件夹结构完全相同...... 使用libgdx的正确方法是什么?
答案 0 :(得分:10)
您应该将所有资源存储在Android资源文件夹中,并将桌面项目链接到该文件夹。在http://www.badlogicgames.com/wordpress/?p=1537
上有一个快速描述编辑:官方的项目设置教程也描述了如何执行此操作。它位于http://code.google.com/p/libgdx/wiki/ProjectSetup#Asset_folder_setup
除了项目设置之外,我认为您的第二种方法是引用两个项目资产的正确方法。修复设置后,它应该在两种环境中都能正常工作。
答案 1 :(得分:8)
桌面项目的Assets文件夹也可以使用Gradle选择 - 将此行添加到build.gradle
文件夹中的desktop
:
sourceSets.main.resources.srcDirs = [ "../android/assets/" ]
或者,如果您没有生成Android项目:
sourceSets.main.resources.srcDirs = [ "../core/assets/" ]
在运行eclipse
/ idea
Gradle任务时,这应该正确链接Eclipse和IntelliJ中的文件夹。与创建链接或手动将文件夹添加到源代码相比,我认为这是迄今为止最容易设置和管理的。
答案 2 :(得分:3)
经过大量的实验,我发现了一种让它发挥作用的方法:
对于android模块,Gdx.files.internal植根于android资源文件夹。 对于桌面模块,Gdx.files.internal植根于顶层项目文件夹。
因此,如果您将android资源文件夹中的文件或目录的符号链接放在顶级项目文件夹下(即与android,core,desktop等dirs并行),那么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
(注意窗口无法处理符号链接中的相对路径。您还必须以管理员身份运行cmd)
如果您在运行时也这样做,请确保同步文件。
答案 3 :(得分:1)
libGDX Wiki摘录:
资产文件夹设置
Android项目有一个名为assets
的子文件夹,它是自动创建的。 Android应用程序可用的文件必须放在此处。这是有问题的,因为桌面应用程序必须可以使用这些相同的文件。桌面项目可以配置为在Android项目中查找资产,而不是维护所有文件的两个副本:
点击Source
标签,点击Link Source
,Browse
,从Android项目中选择“资产”文件夹,然后点击确定。
为文件夹名称指定“assets”,然后单击完成,然后单击确定。
注意:如果您的桌面和Android项目位于同一个父文件夹中,您可以使用“PARENT-1-PROJECT_LOC / gamename-android / assets”作为链接资产文件夹的位置,其中“gamename-android”是其名称你的Android项目。如果您打算与他人共享项目,这比硬编码路径更好。
答案 4 :(得分:0)
检查所有文件在android资源文件夹中是否为小写
答案 5 :(得分:0)
引用android资源文件夹不是一个好主意,因为:
1)Eclipse可能会将您引用的资源文件夹复制到android项目的apk中,复制大小 2)路径应该是平台不可知。在我看来,这是一个JogFiles实现问题。
最好将下面的类复制到类路径中:
package com.badlogic.gdx.backends.jogl;
/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.badlogic.gdx.backends.jogl;
import java.io.File;
import com.badlogic.gdx.Files;
import com.badlogic.gdx.files.FileHandle;
/**
* Gdx class overrided in order to keep internal files paths platform independent.
* Android search at "assets/" folder. And so we do here for 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) {
// append "asset/" prefix to those urls who did not already have it.
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;
}
}