在开发游戏时,总是要使用很多的资源文件,比如:图片、音乐 等。而我们经常会遇到一些商业游戏中都看不到这些资源文件,那是因为商业游戏,一般都会将这些资源文件打包成二进制的文件,然后在程序中读取,并使用。这 样的游戏看上去更显得专业一些,本文我们就来学习一个最简单的将资源文件打包成二进制文件的方法使用BinCompiler将资源文件打包成二进制文 件。
所需工具:BinCompiler
运行 BinCompiler.exe ,指定要打包的资源文件的路径,和输出二进制文件的路径,如下图所示。
点击create按钮,即在我们制定的位置产生一个bin文件,当然在这个bin文件所在目录还会产生一个index.txt文件。我们在程序中读取这些资源时,需要使用这个index.txt。index.txt文件如下所示:
FNameIndexPos Size
A_04.png004141
A_03.png141453802
A_02.png279513813
A_01.png3117683959
接下来我们可以使用BinReader.java文件中的两个方法来读取这些资源文件了。
代码清单:BinReader.java
01
/*******************************************************************************
02
* Reads a file from the BIN file and return data as a byte buffer
03
*******************************************************************************/
04
public byte[] readFile(String binfile, int pos)
05
{
06
byte buffer[];
07
int len;
08
09
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。