在 libgdx 中管理桌面和设备版本之间的资产
Posted
技术标签:
【中文标题】在 libgdx 中管理桌面和设备版本之间的资产【英文标题】:Managing assets between desktop and device version in libgdx 【发布时间】:2012-04-11 04:28:44 【问题描述】:我正在使用 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 的正确方法是什么?
【问题讨论】:
【参考方案1】:您应该将所有资产存储在 Android 资产文件夹中,并将您的桌面项目链接到该文件夹。在http://www.badlogicgames.com/wordpress/?p=1537有一个简短的描述
编辑:官方项目设置教程也描述了如何执行此操作。它位于http://code.google.com/p/libgdx/wiki/ProjectSetup#Asset_folder_setup
除了项目设置,我相信您的第二种方法是从两个项目中引用资产的正确方法。修复设置后,它应该可以在两种环境中正常工作。
【讨论】:
【参考方案2】:桌面项目的Assets文件夹也可以用Gradle选择-将此行添加到desktop
文件夹中的build.gradle
:
sourceSets.main.resources.srcDirs = [ "../android/assets/" ]
或者,如果您没有生成 Android 项目:
sourceSets.main.resources.srcDirs = [ "../core/assets/" ]
这应该在运行eclipse
/idea
Gradle 任务时正确链接 Eclipse 和 IntelliJ 中的文件夹。与创建链接或手动将文件夹添加到源相比,我认为这是迄今为止最容易设置和管理的。
【讨论】:
做到了。这应该是公认的答案。谢谢! 不知道为什么这个解决方案没有在 libgdx 官方网站上描述,因为它是最干净的解决方案......【参考方案3】:经过大量实验后,我发现了一种让它发挥作用的方法:
对于 android 模块,Gdx.files.internal 位于 android assets 文件夹中。 对于桌面模块,Gdx.files.internal 位于顶层项目文件夹中。
因此,如果您将 android assets 文件夹中的文件或目录的符号链接放到顶层项目文件夹的正下方(即与 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 的【参考方案4】: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”是名称你的安卓项目。如果您打算与他人共享您的项目,这比硬编码路径要好。
【讨论】:
【参考方案5】:检查你所有的文件在android资产文件夹中是否都是小写
【讨论】:
【参考方案6】:引用 android assets 文件夹并不是一个好主意,因为:
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;
【讨论】:
以上是关于在 libgdx 中管理桌面和设备版本之间的资产的主要内容,如果未能解决你的问题,请参考以下文章