转:使用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
原文地址:https://www.cnblogs.com/xbglbc/p/2012571.html