2012-03-27 7 views
10

Estoy creando un pequeño juego de Android usando libgdx. Por ahora tengo una copia de los recursos del juego en la carpeta del proyecto de escritorio y en la carpeta del proyecto de Android. Por alguna extraña razón, tengo que acceder a esos archivos de manera diferente en cada una de las dos versiones.Gestionar activos entre la versión de escritorio y dispositivo en libgdx

Esto funciona bien en la aplicación de escritorio, pero me da una excepción FileNotFound en la aplicación para Android:

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

Si quito los "activos" en el nombre del archivo que es al revés (funciona Android, los accidentes de escritorio):

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

No estoy seguro de cuál es el problema. La estructura de la carpeta es exactamente la misma para ambos proyectos ... ¿Cuál es la forma correcta de hacerlo con libgdx?

Respuesta

10

Debe almacenar todos sus recursos en la carpeta de activos de Android y vincular su proyecto de escritorio a esa carpeta. Hay una descripción rápida de esto en http://www.badlogicgames.com/wordpress/?p=1537

EDITAR: El tutorial oficial de Configuración de proyectos describe cómo realizar esto también. Se encuentra en http://code.google.com/p/libgdx/wiki/ProjectSetup#Asset_folder_setup

Además de la configuración del proyecto, creo que su segundo método es la forma correcta de referenciar los activos de ambos proyectos. Después de arreglar su configuración, debería funcionar correctamente en ambos entornos.

0

Comprobar si todos sus archivos están en minúsculas en la carpeta de activos androide

0

referencia a la carpeta de activos Android no es una idea muy buena, ya que:

1) Eclipse probly tomar copiar sus activos de referencia carpeta a la apk del proyecto android, duplicando el tamaño de 2) las rutas deben ser agnósticos de plataforma. Como lo veo, este es un problema de implementación de JogFiles.

Es mejor copiar la clase folloing a la ruta de clases:

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 extracto:

configuración de la carpeta de activos
El proyecto Android ha nombrado a una subcarpeta assets , que fue creado automáticamente Los archivos disponibles para la aplicación de Android deben colocarse aquí. Esto es problemático, porque estos mismos archivos deben estar disponibles para la aplicación de escritorio. En lugar de mantener dos copias de todos los archivos, el proyecto de escritorio se puede configurar para encontrar los activos en el proyecto Android:

Haga clic en la pestaña Source, haga clic Link Source, Browse, seleccione la carpeta "activos" de su proyecto Android y haga clic en OK.
Especifique "activos" para el nombre de la carpeta y haga clic en Finalizar y luego Aceptar.

Nota: Si sus proyectos de escritorio y Android están en la misma carpeta principal, puede usar "PARENT-1-PROJECT_LOC/gamename-android/assets" para la ubicación de la carpeta de activos vinculados, donde "gamename-android" es el nombre de tu proyecto Android Esto es mejor que un camino codificado si planea compartir sus proyectos con otros.

3

Después de mucha experimentación he descubierto una manera de conseguir que esto funcione:

Para el módulo androide, Gdx.files.internal tiene sus raíces en la carpeta de activos androide. Para el módulo de escritorio, Gdx.files.internal está enraizado en la carpeta del proyecto toplevel.

Así que si coloca un enlace simbólico desde archivos o directorios en su carpeta de activos de Android justo debajo de su carpeta de proyecto de nivel superior (es decir, paralelo a android, core, desktop, etc. dirs) entonces Gdx.files.internal funcionará para ambos.

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

Consejo adicional - Si utiliza Windows, puede utilizar el comando MKLINK en la consola CMD para crear estas:

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

(ventanas nota puedes soportar las rutas relativas en los enlaces simbólicos también. tiene que ejecutar cmd como administrador)

asegúrese de sincronizar sus archivos si está haciendo esto mientras se ejecuta, también.

+0

Esta es la forma más fácil, funciona como un amuleto y no es IDE Specific – Lyoneel

7

Activos carpeta de proyecto de escritorio pueden ser también elegidos con Gradle - añadir esta línea a build.gradle en desktop carpeta:

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

O, si no generó un proyecto Android:

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

Esto debería vincular correctamente la carpeta tanto en Eclipse como en IntelliJ al ejecutar eclipse/idea Tareas de Gradle. En comparación con la creación de enlaces o la adición manual de la carpeta a la fuente, creo que es la más fácil de configurar y administrar con diferencia.

+3

Eso lo hizo. Esta debería ser la respuesta aceptada. ¡Gracias! –

+0

No estoy seguro de por qué esta solución no se describe en el sitio oficial de libgdx, ya que es la solución más limpia ... –

Cuestiones relacionadas