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文件如下所示:
- 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
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
- /*******************************************************************************
- * 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);
- }
/******************************************************************************* * 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文件中去找对应的就可以了。
例如我们读取一个图片
- Image image = readimage("images.bin", 0);
Image image = readimage("images.bin", 0);
可以看出,我们传入的pos的值是0,对应index.txt中就应该是A_04.png。
很简单,可以直接使用就是了。谢谢大家支持。