zoukankan      html  css  js  c++  java
  • 转:使用BinCompiler将资源文件打包成二进制文件

    http://yarin.iteye.com/blog/546923

    版权申明:http://yarin.javaeye.com/blog/453262  

    在开发游戏时,总是要使用很多的资源文件,比如:图片、音乐等。而我们经常会遇到一些商业游戏中都看不到这些资源文件,那是因为商业游戏,一般都会将这些资源文件打包成二进制的文件,然后在程序中读取,并使用。这样的游戏看上去更显得专业一些,本文我们就来学习一个最简单的将资源文件打包成二进制文件的方法——使用BinCompiler将资源文件打包成二进制文件。

    所需工具:BinCompiler(见附件)

    运行“BinCompiler.exe”,指定要打包的资源文件的路径,和输出二进制文件的路径,如下图所示。


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

    Java代码 复制代码 收藏代码
    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 
    FName	Index	Pos	Size
    A_04.png	0	0	4141
    A_03.png	1	4145	3802
    A_02.png	2	7951	3813
    A_01.png	3	11768	3959

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

    代码清单:BinReader.java

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

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

    例如我们读取一个图片

    Java代码 复制代码 收藏代码
    1. Image image = readimage("images.bin", 0); 
    Image image = readimage("images.bin", 0);

    可以看出,我们传入的pos的值是0,对应index.txt中就应该是A_04.png。

    很简单,可以直接使用就是了。谢谢大家支持。

    • 大小: 54.9 KB
  • 相关阅读:
    xml的servlet配置
    python Matplotlib 系列教程(三)——绘制直方图和条形图
    https://blog.csdn.net/blmoistawinde/article/details/84329103
    机器学习——标准化/归一化的目的、作用和场景
    梯度提升决策树(GBDT)与XGBoost、LightGBM
    最容易理解的对卷积(convolution)的解释
    如何通俗易懂地解释卷积?
    卷积神经网络(CNN)之一维卷积、二维卷积、三维卷积详解
    Conv1D和Conv2D的区别
    卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习)
  • 原文地址:https://www.cnblogs.com/xbglbc/p/2012571.html
Copyright © 2011-2022 走看看