在桌面和设备版本之间管理资产libgdx

在桌面和设备版本之间管理资产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 SourceBrowse,从您的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)

确保在同时运行时同步文件。

+0

这是最简单的方式,像一个魅力,而不是IDE具体 – Lyoneel 2014-10-26 18:35:05

资产桌面项目的文件夹,也可以选择与摇篮 - 加入这一行build.gradledesktop文件夹:

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

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

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

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

+3

这样做。这应该是被接受的答案。谢谢! – 2016-02-18 16:08:54

+0

不知道为什么这个解决方案没有在libgdx官方网站上描述,因为它是最干净的解决方案... – 2017-05-09 11:12:11