在 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 SourceBrowse,从你的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 中管理桌面和设备版本之间的资产的主要内容,如果未能解决你的问题,请参考以下文章

云开发项目如何管理资产下的设备?

声音无法在设备上播放完整音量(Libgdx)

LibGdx - 从资产管理器加载 json 文件时出错

资产管理文档

使用资产管理器 LibGDX 加载精灵

使用资产管理器 LibGDX 加载精灵