Управление ресурсами между десктопом и версией устройства в libgdx - PullRequest
10 голосов
/ 27 марта 2012

Я создаю небольшую игру для Android с использованием libgdx.На данный момент у меня есть копия ресурсов игры в папке проекта на рабочем столе и в папке проекта Android.По какой-то странной причине мне приходится обращаться к этим файлам по-разному в каждой из двух версий.

Это прекрасно работает в настольном приложении, но дает мне исключение FileNotFound в приложении для Android:

Texture texture = new Texture(Gdx.files.internal("assets/someImage.png"));

Если я удалю «активы» из имени файла, это будет наоборот (Android работает, сбой рабочего стола):

Texture texture = new Texture(Gdx.files.internal("someImage.png"));

Я не уверен, в чем проблема.Структура папок одинакова для обоих проектов ... Как правильно это сделать с libgdx?

Ответы [ 6 ]

10 голосов
/ 27 марта 2012

Вы должны хранить все свои активы в папке ресурсов Android и связывать свой настольный проект с этой папкой. Это краткое описание на http://www.badlogicgames.com/wordpress/?p=1537

РЕДАКТИРОВАТЬ: Официальное руководство по установке проекта описывает, как это сделать. Это найдено в http://code.google.com/p/libgdx/wiki/ProjectSetup#Asset_folder_setup

Помимо настройки проекта, я считаю, что ваш второй метод является правильным способом ссылки на ресурсы из обоих проектов. После того, как вы исправите настройки, они должны нормально работать в обеих средах.

8 голосов
/ 21 ноября 2015

Папка Assets настольного проекта также может быть выбрана с помощью Gradle - добавьте эту строку в build.gradle в папке desktop:

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

Или, если вы не создавали проект Android:

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

Это должно правильно связать папку в Eclipse и IntelliJ при выполнении задач eclipse / idea Gradle.По сравнению с созданием ссылок или ручным добавлением папки в исходный код, я думаю, что это самый простой в настройке и управлении.

3 голосов
/ 29 июля 2014

После долгих экспериментов я нашел способ заставить это работать:

Для модуля 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, вы можете использовать команду mklink в командной оболочке cmd для их создания:

mklink /d sound d:\project\android\assets\sound
mklink /d images d:\project\android\assets\images

(обратите внимание, что окна не могут обрабатывать относительные пути в символических ссылках. Также вы должны запустить cmd от имени администратора)

Обязательно синхронизируйте свои файлы, если вы делаете это и во время работы.

1 голос
/ 15 февраля 2014

извлечение libGDX Wiki:

Настройка папки актива
Проект Android имеет подпапку с именем assets, которая была создана автоматически. Файлы, доступные для приложения Android, должны быть размещены здесь. Это проблематично, потому что эти же файлы должны быть доступны для настольного приложения. Вместо того, чтобы поддерживать две копии всех файлов, проект рабочего стола можно настроить для поиска ресурсов в проекте Android:

Перейдите на вкладку Source, нажмите Link Source, Browse, выберите папку "assets" в вашем проекте Android и нажмите OK .
Укажите «assets» для имени папки и нажмите Готово , затем OK .

Примечание. Если ваш рабочий стол и проекты Android находятся в одной родительской папке, вы можете использовать «PARENT-1-PROJECT_LOC / gamename-android / assets» для расположения папки связанных ресурсов, где «gamename-android» - это имя ваш проект Android. Это лучше, чем жестко заданный путь, если вы планируете делиться своими проектами с другими.

0 голосов
/ 27 июля 2012

Ссылка на папку ресурсов android не очень хорошая идея, потому что:

1) Eclipse, вероятно, скопирует вашу папку ресурсов, на которую ссылаются, в apk проекта android, дублируя размер 2) пути должныбыть агностиком платформы.На мой взгляд, это проблема реализации JogFiles.

Вам лучше скопировать следующий класс в ваш путь к классу:

</p>

<code>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;
    }
}
</code>

0 голосов
/ 19 июля 2012

Проверьте, что все ваши файлы в нижнем регистре находятся в папке ресурсов Android

...