在桌面和设备版本之间管理资产libgdx
我正在使用libgdx构建一个小型的Android游戏。 现在我在桌面项目文件夹和Android项目文件夹中有一个游戏资源的副本。由于一些奇怪的原因,我必须在两个版本中分别访问这些文件。在桌面和设备版本之间管理资产libgdx
这个工作在桌面应用程序很好,但给我的Android应用程序一个FileNotFound例外:
Texture texture = new Texture(Gdx.files.internal("assets/someImage.png"));
如果我从文件名中去掉“资产”这一轮的其他方式(Android版,桌面崩溃):
Texture texture = new Texture(Gdx.files.internal("someImage.png"));
我不确定是什么问题。这两个项目的文件夹结构完全相同...... 使用libgdx的正确方法是什么?
您应该将所有资产存储在Android资产文件夹中,并将桌面项目链接到该文件夹。这里有一个简短的说明http://www.badlogicgames.com/wordpress/?p=1537
编辑:官方的Project Setup教程介绍了如何执行此操作。它被发现在http://code.google.com/p/libgdx/wiki/ProjectSetup#Asset_folder_setup
除了项目设置,我相信你的第二种方法是从两个项目引用资产的正确方法。修复安装后,它应该在两种环境中都能正常工作。
检查是否所有的文件都在Android的资产文件夹
引用了android资产的文件夹是不是一个很好的主意较低的情况下,这是因为:
1)Eclipse将probly采取复制您参考资产文件夹到Android项目的apk,重复大小 2)路径应该是平台不可知论的。正如我所看到的,这是一个JogFiles实现问题。
你最好的folloing类复制到类路径:
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;
}
}
libGDX维基提取物:
资产文件夹设置
而Android项目的子文件夹命名为assets
,它是自动创建的。 Android应用程序可用的文件必须放在这里。这是有问题的,因为这些相同的文件必须可用于桌面应用程序。而不是保持所有文件的两个副本,桌面项目可以配置为发现在Android项目的资产:
单击Source
选项卡,单击Link Source
,Browse
,从您的Android项目中选择“资产”文件夹,点击确定。
指定文件夹名称的“assets”并单击Finish then OK。
注意:如果您的桌面和Android项目位于同一父文件夹中,则可以使用“PARENT-1-PROJECT_LOC/gamename-android/assets”作为链接资产文件夹的位置,其中“gamename-android”为您的Android项目的名称。如果您计划与他人分享您的项目,这比硬编码路径要好。
经过大量的实验,我发现一个方法来得到这个工作:
为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外壳使用mklink命令来创建这些:
mklink /d sound d:\project\android\assets\sound
mklink /d images d:\project\android\assets\images
(注意:Windows不能在符号链接处理相对路径还你。必须以管理员身份运行cmd)
确保在同时运行时同步文件。
资产桌面项目的文件夹,也可以选择与摇篮 - 加入这一行build.gradle
在desktop
文件夹:
sourceSets.main.resources.srcDirs = [ "../android/assets/" ]
或者,如果你没有生成Android项目:
sourceSets.main.resources.srcDirs = [ "../core/assets/" ]
这应该在运行eclipse
/idea
Gradle任务时正确链接Eclipse和IntelliJ中的文件夹。与创建链接或手动将文件夹添加到源代码相比,我认为这是迄今为止最容易设置和管理的。
这样做。这应该是被接受的答案。谢谢! – 2016-02-18 16:08:54
不知道为什么这个解决方案没有在libgdx官方网站上描述,因为它是最干净的解决方案... – 2017-05-09 11:12:11
这是最简单的方式,像一个魅力,而不是IDE具体 – Lyoneel 2014-10-26 18:35:05