Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 【Android游戲引擎libgdx】實現AssetManager自定義AssetLoader以及加載方式示例

【Android游戲引擎libgdx】實現AssetManager自定義AssetLoader以及加載方式示例

編輯:Android開發實例

 在圖片簡單加密解密篇中介紹了通過簡單的異或來對圖片資源進行加密解密。

  但是,當運行程序時出現鎖屏,運行其他程序而轉入後台時,將會出現問題。當我們resume時,發現圖片都失效了。

  為什麼?

  個人理解為原資源不被resume後的程序管理了,這時我們想到在resume中我們重新再加載一遍資源,這的卻是個辦法。  

  嘗試後確實解決了這個問題,但是新的問題出現了。測試中會出現NullPointerException的異常,但出現概率較小,最後未查到原因。

  

  又重新查看了AssetManager的使用,它有很多AssetLoader,作者也提供了添加自定義AssetLoader的方法setLoader。

  參考TextureLoader完成一個TextureExLoader擴展類

  1. public class TextureExLoader extends 
  2.         AsynchronousAssetLoader<TextureEx, TextureExLoader.TextureExParameter> { 
  3.     TextureData data; 
  4.     TextureEx texture; 
  5.     int size = 0; 
  6.     String key = ""; 
  7.  
  8.     public TextureExLoader(FileHandleResolver resolver) { 
  9.         super(resolver); 
  10.     } 
  11.  
  12.     @Override 
  13.     public void loadAsync(AssetManager manager, String fileName, 
  14.             TextureExParameter parameter) { 
  15.         Pixmap pixmap = null; 
  16.         Format format = null; 
  17.         boolean genMipMaps = false; 
  18.         texture = null; 
  19.         size = parameter.size; 
  20.         key = parameter.key; 
  21.          
  22.         FileHandle handle = resolve(fileName); 
  23.         pixmap = DecipherPixmap(handle); 
  24.         data = new FileTextureExData(handle, pixmap, format, genMipMaps); 
  25.     } 
  26.  
  27.     @Override 
  28.     public TextureEx loadSync(AssetManager manager, String fileName, 
  29.             TextureExParameter parameter) { 
  30.         if (texture != null) { 
  31.             texture.load(data); 
  32.             return texture; 
  33.         } else { 
  34.             return new TextureEx(data); 
  35.         } 
  36.     } 
  37.  
  38.     @SuppressWarnings("rawtypes") 
  39.     @Override 
  40.     public Array<AssetDescriptor> getDependencies(String fileName, 
  41.             TextureExParameter parameter) { 
  42.         return null; 
  43.     } 
  44.  
  45.     public Pixmap DecipherPixmap(FileHandle handle) { 
  46.         Pixmap pixmap = null; 
  47.         int value = -1; 
  48.         byte[] bs = new byte[size]; 
  49.         InputStream is = handle.read(); 
  50.         int cx = 0; 
  51.         try { 
  52.             while ((value = is.read()) != -1) { 
  53.                 bs[cx] = (byte) (value ^ key.hashCode()); 
  54.                 cx++; 
  55.             } 
  56.         } catch (Exception e) { 
  57.             e.printStackTrace(); 
  58.         } finally { 
  59.             try { 
  60.                 is.close(); 
  61.             } catch (Exception e) { 
  62.                 e.printStackTrace(); 
  63.             } 
  64.         } 
  65.         pixmap = new Pixmap(bs, 0, bs.length); 
  66.         return pixmap; 
  67.     } 
  68.  
  69.     static public class TextureExParameter extends 
  70.             AssetLoaderParameters<TextureEx> { 
  71.         public int size = 0; 
  72.         public String key = ""; 
  73.     } 
  74.  
  75.    ...... 

 

  再繼承一個紋理類

  1. public class TextureEx extends Texture{ 
  2.  
  3.     public TextureEx(Pixmap pixmap) { 
  4.         super(pixmap); 
  5.     } 
  6.      
  7.     public TextureEx (TextureData data) { 
  8.         super(data); 
  9.     } 

  大家可以對比看下,和原來的TextureLoader對比,我們修改了loadAsync方法,新增了DecipherPixmap方法,和調整了參數結構。其中DecipherPixmap

通過傳入文件句柄來獲得解密後的圖片Pixmap。

  在loadAsync中我們通過FileTextureExData生成紋理數據。FileTextureExData也是一個擴展類。

  在prepare方法中修改了pixmap的生成方法,需要解密,而非直接解析文件。

  1. public class FileTextureExData implements TextureData { 
  2.         final FileHandle file; 
  3.         int width = 0; 
  4.         int height = 0; 
  5.         Format format; 
  6.         Pixmap pixmap; 
  7.         boolean useMipMaps; 
  8.         boolean isPrepared = false; 
  9.  
  10.         public FileTextureExData(FileHandle file, Pixmap preloadedPixmap, 
  11.                 Format format, boolean useMipMaps) { 
  12.             this.file = file; 
  13.             this.pixmap = preloadedPixmap; 
  14.             this.format = format; 
  15.             this.useMipMaps = useMipMaps; 
  16.             if (pixmap != null) { 
  17.                 width = pixmap.getWidth(); 
  18.                 height = pixmap.getHeight(); 
  19.                 if (format == null) 
  20.                     this.format = pixmap.getFormat(); 
  21.             } 
  22.         } 
  23.  
  24.         @Override 
  25.         public boolean isPrepared() { 
  26.             return isPrepared; 
  27.         } 
  28.  
  29.         @Override 
  30.         public void prepare() { 
  31.             if (isPrepared) 
  32.                 throw new GdxRuntimeException("Already prepared"); 
  33.             if (pixmap == null) { 
  34.                 pixmap = DecipherPixmap(file); 
  35.                 width = pixmap.getWidth(); 
  36.                 height = pixmap.getHeight(); 
  37.                 if (format == null) 
  38.                     format = pixmap.getFormat(); 
  39.             } 
  40.             isPrepared = true; 
  41.         } 
  42.  
  43.         @Override 
  44.         public Pixmap consumePixmap() { 
  45.             if (!isPrepared) 
  46.                 throw new GdxRuntimeException( 
  47.                         "Call prepare() before calling getPixmap()"); 
  48.             isPrepared = false; 
  49.             Pixmap pixmap = this.pixmap; 
  50.             this.pixmap = null; 
  51.             return pixmap; 
  52.         } 
  53.  
  54.         @Override 
  55.         public boolean disposePixmap() { 
  56.             return true; 
  57.         } 
  58.  
  59.         @Override 
  60.         public int getWidth() { 
  61.             return width; 
  62.         } 
  63.  
  64.         @Override 
  65.         public int getHeight() { 
  66.             return height; 
  67.         } 
  68.  
  69.         @Override 
  70.         public Format getFormat() { 
  71.             return format; 
  72.         } 
  73.  
  74.         @Override 
  75.         public boolean useMipMaps() { 
  76.             return useMipMaps; 
  77.         } 
  78.  
  79.         @Override 
  80.         public boolean isManaged() { 
  81.             return true; 
  82.         } 
  83.  
  84.         public FileHandle getFileHandle() { 
  85.             return file; 
  86.         } 
  87.  
  88.         @Override 
  89.         public TextureDataType getType() { 
  90.             return TextureDataType.Pixmap; 
  91.         } 
  92.  
  93.         @Override 
  94.         public void consumeCompressedData() { 
  95.             throw new GdxRuntimeException( 
  96.                     "This TextureData implementation does not upload data itself"); 
  97.         } 
  98.     } 

 

  最後我們來加載想要的資源

  1. @Override 
  2.     public void create() { 
  3.         manager = new AssetManager(); 
  4.         manager.setLoader(TextureEx.class, new TextureExLoader( 
  5.                 new InternalFileHandleResolver())); 
  6.  
  7.         TextureExParameter parameter1 = new TextureExParameter(); 
  8.         parameter1.size = 411517; 
  9.         parameter1.key = "key"; 
  10.  
  11.         manager.load("test.dat", TextureEx.class, parameter1); 
  12.  

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved