2016-06-24 12 views
1

У меня есть 2 экземпляра AssetManager: один для базовых текстур и один для высококачественных текстур. Основные текстуры расположены в папке «android/assets», а текстуры высокого качества упакованы в zip-файл. Содержимое (имена файлов) в этих папках одинаково - в zip-архиве есть только текстуры лучшего качества.Не удалось загрузить TextureAtlas из zip-архива с помощью AssetManager - libgdx

AssetManager создает исключение: «Не удалось загрузить зависимости ресурса: teamLogo.png», когда я пытаюсь загрузить TextureAtlas из zip-файла. Когда я загружаю файл текстуры, все в порядке. Загрузка TextureAtlas работает только из папки «android/assets».

AssetManager с помощью 'Android/активы' - все в порядке:

AssetManager am = new AssetManager(); 
am.load("images/image.png", Texture.class); 
am.load("images/teamLogo.pack", TextureAtlas.class); 

AssetManager используя почтовый архив - не может загрузить текстурный атлас:

ZipFile archive = new ZipFile(expansionFileHandle.file()); 
ArchiveFileHandleResolver resolver = new ArchiveFileHandleResolver(archive); 
AssetManager amHQ = new AssetManager(resolver); 

Это прекрасно работает:

amHQ.load("images/image.png", Texture.class); 

Это не работает:

amHQ.load("images/teamLogo.pack", TextureAtlas.class); 

класс ArchiveFileHandle:

public class ArchiveFileHandle extends FileHandle 
{ 
final ZipFile archive; 
final ZipEntry archiveEntry; 

public ArchiveFileHandle (ZipFile archive, File file) 
{ 
    super(file, FileType.Classpath); 
    this.archive = archive; 
    archiveEntry = this.archive.getEntry(file.getPath()); 
} 

public ArchiveFileHandle (ZipFile archive, String fileName) 
{ 
    super(fileName.replace('\\', '/'), FileType.Classpath); 
    this.archive = archive; 
    this.archiveEntry = archive.getEntry(fileName.replace('\\', '/')); 
} 

@Override 
public FileHandle child (String name) 
{ 
    name = name.replace('\\', '/'); 
    if (file.getPath().length() == 0) 
     return new ArchiveFileHandle(archive, new File(name)); 
    return new ArchiveFileHandle(archive, new File(file, name)); 
} 

@Override 
public FileHandle sibling (String name) 
{ 
    name = name.replace('\\', '/'); 
    if (file.getPath().length() == 0) 
     throw new GdxRuntimeException("Cannot get the sibling of the root."); 
    return new ArchiveFileHandle(archive, new File(file.getParent(), name)); 
} 

@Override 
public FileHandle parent() 
{ 
    File parent = file.getParentFile(); 
    if (parent == null) 
    { 
     if (type == FileType.Absolute) 
      parent = new File("/"); 
     else 
      parent = new File(""); 
    } 
    return new ArchiveFileHandle(archive, parent); 
} 

@Override 
public InputStream read() 
{ 
    try 
    { 
     return archive.getInputStream(archiveEntry); 
    } 
    catch (IOException e) 
    { 
     throw new GdxRuntimeException("File not found: " + file + " (Archive)"); 
    } 
} 

@Override 
public boolean exists() 
{ 
    return archiveEntry != null; 
} 

@Override 
public long length() 
{ 
    return archiveEntry.getSize(); 
} 

@Override 
public long lastModified() 
{ 
    return archiveEntry.getTime(); 
} 

Что я делаю неправильно?

ответ

1

Yeaaahhh, я нашел его :) ArchiveFileHandle не удался загрузить зависимости текстурного атласа, потому что он не может найти эти файлы. При поиске в zip-архиве вы должны заменить символ '\' на '/'. Ошибка была в одном из конструкторов ArchiveFileHandle. Эта линия:

archiveEntry = this.archive.getEntry(file.getPath()); 

должно быть:

archiveEntry = this.archive.getEntry(file.getPath().replace('\\', '/')); 

Теперь все работает отлично

0

Вы должны установить загрузчик AssetManager для загрузки Textureatlus как этого

amHQ.setLoader(TextureAtlas.class, new TextureAtlasLoader(resolver)); 
+0

Нет разницы, это не работает – Bero