【问题标题】:Managing assets between desktop and device version in libgdx在 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 的正确方法是什么?

【问题讨论】:

    标签: android textures assets filenotfoundexception 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; } }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-09
            • 2023-03-23
            • 2015-03-03
            • 1970-01-01
            • 1970-01-01
            • 2018-04-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多