2012-03-27 8 views
10

Sto costruendo un piccolo gioco Android usando libgdx. Per ora ho una copia delle risorse del gioco nella cartella del progetto desktop e nella cartella del progetto Android. Per qualche strana ragione devo accedere a quei file in modo diverso in ciascuna delle due versioni.Gestione risorse tra desktop e dispositivo in libgdx

Questo funziona bene in un'applicazione desktop, ma mi dà un'eccezione FileNotFound in app Android:

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

Se rimuovo le "attività" dal nome del file è il contrario (Android funziona, si blocca il desktop):

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

Non so quale sia il problema. La struttura delle cartelle è esattamente la stessa per entrambi i progetti ... Qual è il modo giusto per farlo con libgdx?

risposta

10

È necessario archiviare tutte le risorse nella cartella delle risorse Android e collegare il progetto desktop a tale cartella. C'è una breve descrizione di questo a http://www.badlogicgames.com/wordpress/?p=1537

MODIFICA: l'esercitazione di installazione del progetto ufficiale descrive come eseguire anche questo. Si trova a http://code.google.com/p/libgdx/wiki/ProjectSetup#Asset_folder_setup

Oltre alla configurazione del progetto, credo che il secondo metodo sia il modo corretto di fare riferimento alle risorse di entrambi i progetti. Dopo aver sistemato la configurazione, dovrebbe funzionare correttamente in entrambi gli ambienti.

0

Controllare se tutti i file sono in minuscolo nella cartella Assets Android

0

fa riferimento alla cartella Assets Android non è davvero una buona idea, perché:

1) Eclipse probly prendere a copiare il vostro patrimonio di riferimento cartella per l'apk del progetto Android, duplicando la dimensione di 2) i percorsi dovrebbero essere agnostici della piattaforma. A mio avviso, si tratta di un problema di implementazione di JogFiles.

È meglio copiare la classe folloing al 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 estratto:

impostazione della cartella Asset
Il progetto Android ha nominato una sottocartella assets , che è stato creato automaticamente. I file disponibili per l'applicazione Android devono essere posizionati qui. Questo è problematico, perché questi stessi file devono essere disponibili per l'applicazione desktop. Piuttosto che mantenere due copie di tutti i file, il progetto desktop può essere configurato in modo da trovare le risorse nel progetto Android:

Fare clic sulla scheda Source, fare clic su Link Source, Browse, selezionare la cartella "beni" dal progetto Android e fare clic su OK.
Specificare "risorse" per il nome della cartella e fare clic su Fine quindi OK.

Nota: se i progetti desktop e Android si trovano nella stessa cartella principale, è possibile utilizzare "PARENT-1-PROJECT_LOC/gamename-android/assets" per la posizione della cartella risorse collegate, dove "gamename-android" è il nome del tuo progetto Android. Questo è meglio di un percorso hard-coded se hai intenzione di condividere i tuoi progetti con gli altri.

3

Dopo un sacco di sperimentazione ho scoperto un modo per arrivare a questo lavoro:

Per il modulo di Android, Gdx.files.internal è radicata nella cartella asset Android. Per il modulo desktop, Gdx.files.internal è rootato nella cartella del progetto di livello superiore.

Quindi, se metti un collegamento simbolico da file o directory nella cartella delle risorse di Android appena al di sotto della cartella del progetto di primo livello (cioè, paralleli ad Android, core, desktop, ecc. Dirs) allora Gdx.files.internal funzionerà per entrambi.

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

Bonus suggerimento - Se si utilizza Windows, è possibile utilizzare il comando mklink alla shell cmd per creare questi:

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

(finestre nota smussano gestire i percorsi relativi a link simbolici anche voi. devi eseguire cmd come amministratore)

assicurati di sincronizzare i file se lo stai facendo anche durante l'esecuzione.

+0

Questo è il modo più semplice, funziona come un incantesimo e non è IDE specifico – Lyoneel

7

Assets cartella di progetto del desktop possono essere scelti anche con Gradle - aggiungere questa linea a build.gradle in desktop cartella:

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

Oppure, se non si genera un progetto Android:

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

Questo dovrebbe collegare correttamente la cartella sia in Eclipse che in IntelliJ quando si eseguono attività eclipse/idea Gradle. Rispetto alla creazione di collegamenti o all'aggiunta manuale della cartella all'origine, penso che sia la più facile da configurare e gestire di gran lunga.

+3

Questo l'ha fatto. Questa dovrebbe essere la risposta accettata. Grazie! –

+0

Non sei sicuro del motivo per cui questa soluzione non è descritta nel sito ufficiale di libgdx, poiché è la soluzione più pulita ... –