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

时间:2012-03-27 15:44:58

标签: android textures assets filenotfoundexception libgdx

我正在使用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的正确方法是什么?

6 个答案:

答案 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 SourceBrowse,从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; } }