2012-03-27 6 views
10

Ich baue ein kleines Android-Spiel mit libgdx. Für jetzt habe ich eine Kopie der Assets des Spiels im Desktop-Projektordner und im Android-Projektordner. Aus irgendeinem seltsamen Grund muss ich auf diese Dateien in jeder der beiden Versionen anders zugreifen.Verwalten von Assets zwischen Desktop und Geräteversion in libgdx

Dies funktioniert in dem Desktop-App in Ordnung, aber gibt mir eine FileNotFound Ausnahme in dem Android-App:

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

Wenn ich die „Assets“ aus dem Dateinamen zu entfernen ist es umgekehrt (Android arbeitet, Desktop-Abstürze):

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

Ich bin nicht sicher, was das Problem ist. Die Ordnerstruktur ist für beide Projekte identisch ... Was ist der richtige Weg dazu mit libgdx?

Antwort

10

Sie sollten alle Ihre Assets im Assets-Ordner von Android speichern und Ihr Desktop-Projekt mit diesem Ordner verknüpfen. Es gibt eine kurze Beschreibung davon unter http://www.badlogicgames.com/wordpress/?p=1537

EDIT: Das offizielle Project Setup Tutorial beschreibt, wie dies auch zu tun ist. Es ist gefunden bei http://code.google.com/p/libgdx/wiki/ProjectSetup#Asset_folder_setup

Abgesehen von Projekt-Setup glaube ich, dass Ihre zweite Methode ist die richtige Art der Verweis auf die Vermögenswerte aus beiden Projekten. Nachdem Sie Ihr Setup repariert haben, sollte es in beiden Umgebungen ordnungsgemäß funktionieren.

0

Überprüfen Sie, ob alle Ihre Dateien sind in Kleinbuchstaben in Android-Assets Ordner

0

Referenzierung der Android-Assets Ordner nicht eine wirklich gute Idee ist, weil:

1) Eclipse probly Ihre referenzierten Assets nehmen kopieren Ordner auf die apk des Android-Projekts, die Größe von duplizieren 2) Pfade sollten Plattform Agnostics sein. Wie ich es sehe, ist dies ein Problem mit der Implementierung von JogFiles.

Sie kopieren besser die folloing Klasse Ihrem Classpath:

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

1

Libgdx Wiki-Extrakt:

Asset-Ordner Setup
Das Android-Projekt hat einen Unterordner namens assets , die automatisch erstellt wurde. Dateien, die für die Android-Anwendung verfügbar sind, müssen hier abgelegt werden. Dies ist problematisch, da dieselben Dateien für die Desktop-Anwendung verfügbar sein müssen. Anstatt zu halten zwei Kopien aller Dateien kann der Desktop-Projekt konfiguriert werden, um die Assets im Android-Projekt zu finden:

Klicken Sie auf die Source Registerkarte klicken Link Source, Browse, wählen Sie die „Assets“ -Ordner von Ihrem Android-Projekt und Klicken Sie auf OK.
Geben Sie "Assets" für den Ordnernamen ein und klicken Sie auf Fertig stellen dann OK.

Hinweis: Wenn Ihr Desktop und Android im selben übergeordneten Ordner befindet, können Sie „ELTERN-1-project_loc/gamename-android/assets“ für den Standort der verknüpften Assets Ordner, in den „gamename-Android“ ist verwenden Der Name Ihres Android-Projekts. Dies ist besser als ein fest codierter Pfad, wenn Sie Ihre Projekte mit anderen teilen möchten.

3

Nach vielen Experimenten ich einen Weg gefunden, dies zu Arbeit zu bekommen:

für die Android-Modul wird Gdx.files.internal im Android Assets Ordner verwurzelt. Für den Desktop-Modul wird Gdx.files.internal im Toplevel-Projektordner verwurzelt.

Also, wenn Sie einen symbolischen Link von Dateien oder Verzeichnissen in Ihrem Android-Assets Ordner direkt unter Ihrem Top-Level-Projektordner (dh parallel zu Android, Core, Desktop, etc. Verzeichnisse) dann die Gdx.files.internal wird für beide arbeiten.

% cd project 
% ln -s android/assets/sound sound 
% ln -s android/assets/images images 

Bonus-Tipp - wenn Windows verwenden, können Sie den mklink Befehl in dem Befehl Shell diese erstellen verwenden:

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

(Anmerkung Fenster kippen relative Pfade in Symlinks behandeln Sie auch. muss als Administrator cmd ausführen)

stellen Sie sicher, Ihre Dateien zu synchronisieren, wenn Sie dies während des Laufens auch tun.

+0

ist der einfachste Weg, wirkt wie ein Zauber und IDE nicht Specific – Lyoneel

7

Ordner Assets von Desktop-Projekt kann auch mit Gradle gewählt werden - diese Zeile in desktop Ordner build.gradle hinzufügen:

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

Oder, wenn Sie nicht ein Android-Projekt generiert haben:

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

Dies sollte richtig verknüpfen Sie den Ordner in beide Eclipse und IntelliJ wenn eclipse/idea Gradle Aufgaben ausgeführt werden. Verglichen mit dem Erstellen von Links oder dem manuellen Hinzufügen des Ordners zur Quelle, denke ich, dass dies am einfachsten einzurichten und zu verwalten ist. Diese

+3

Das tat es. Dies sollte die akzeptierte Antwort sein. Vielen Dank! –

+0

nicht sicher, warum diese Lösung nicht in Libgdx offizieller Website beschrieben wird, wie es die sauberste Lösung ist ... –