使用BinCompiler将资源文件打包成二进制文件

在开发游戏时,总是要使用很多的资源文件,比如:图片、音乐等。而我们经常会遇到一些商业游戏中都看不到这些资源文件,那是因为商业游戏,一般都会将这些资源文件打包成二进制的文件,然后在程序中读取,并使用。这样的游戏看上去更显得专业一些,本文我们就来学习一个最简单的将资源文件打包成二进制文件的方法——使用BinCompiler将资源文件打包成二进制文件。
所需工具:BinCompiler(见附件)
运行“BinCompiler.exe”,指定要打包的资源文件的路径,和输出二进制文件的路径,如下图所示。

使用BinCompiler将资源文件打包成二进制文件
点击create按钮,即在我们制定的位置产生一个bin文件,当然在这个bin文件所在目录还会产生一个index.txt文件。我们在程序中读取这些资源时,需要使用这个index.txt。index.txt文件如下所示:


  1. FName   Index   Pos Size     
  2. A_04.png    0   0   4141    
  3. A_03.png    1   4145    3802    
  4. A_02.png    2   7951    3813    
  5. A_01.png    3   11768   3959   

接下来我们可以使用BinReader.java文件中的两个方法来读取这些资源文件了。
代码清单:BinReader.java


  1. /*******************************************************************************    
  2.  * Reads a file from the BIN file and return data as a byte buffer    
  3.  *******************************************************************************/    
  4. public byte[] readFile(String binfile, int pos)     
  5. {     
  6.     byte buffer[];     
  7.     int len;     
  8.     
  9.     try {     
  10.     
  11.         InputStream is = Class.getClass().getResourceAsStream("/" + binfile);     
  12.     
  13.         is.skip(pos);     
  14.     
  15.         len  = (is.read() & 0xFF) << 24;     
  16.         len  |= (is.read() 0xFF) << 16;     
  17.         len  |= (is.read() & 0xFF) << 8;     
  18.         len  |= (is.read() & 0xFF);     
  19.     
  20.         buffer = new byte[len];     
  21.          
  22.         is.read(buffer, 0, buffer.length);     
  23.     
  24.         is.close();     
  25.         is = null;     
  26.          
  27.         System.gc();     
  28.     } catch (Exception e) {     
  29.         buffer = null;     
  30.         e.printStackTrace();     
  31.         System.gc();     
  32.         return null;     
  33.     }     
  34.     
  35.     return buffer;     
  36. }     
  37.     
  38. /*******************************************************************************    
  39.  * Reads a file from the BIN file and return data as an Image    
  40.  *******************************************************************************/    
  41. public Image readImage(String binfile, long pos)     
  42. {     
  43.     byte buffer[];     
  44.     long len;     
  45.     
  46.     try {     
  47.         InputStream is = Class.getClass().getResourceAsStream("/" + binfile);     
  48.              
  49.         is.skip(pos);     
  50.              
  51.         len  = (is.read() & 0xFF) << 24;     
  52.         len  |= (is.read() 0xFF) << 16;     
  53.         len  |= (is.read() & 0xFF) << 8;     
  54.         len  |= (is.read() & 0xFF);     
  55.     
  56.         buffer = new byte[len];     
  57.          
  58.         is.read(buffer, 0, buffer.length);     
  59.     
  60.         is.close();     
  61.         is = null;     
  62.          
  63.         System.gc();     
  64.     } catch (Exception e) {     
  65.         buffer = null;     
  66.         e.printStackTrace();     
  67.         System.gc();     
  68.         return null;     
  69.     }     
  70.     
  71.     return Image.createImage(buffer, 0, buffer.length);     
  72. }   

可以看出,这两个方法都只需要传入bin文件名和图片对应的pos,pos值就在我们上面所说的index.txt文件中去找对应的就可以了。 
例如我们读取一个图片


  1. Image image = readimage("images.bin"0);  

可以看出,我们传入的pos的值是0,对应index.txt中就应该是A_04.png。 
很简单,可以直接使用就是了。谢谢大家支持。



本文转自 yarin 51CTO博客,原文链接:http://blog.51cto.com/yarin/381934,如需转载请自行联系原作者

上一篇:Oracle数据库


下一篇:C/C++使用VOID指针保存结构体数据到二进制文件并且读取