主题:初到贵宝地,灌一点游戏开发的东东 -- foundera
解拆《傲世三国》的图形文件 出 处:程序人生
《傲世三国》的图片资源都按555与565格式分别存放在555与565两个目录下,图片都是以资源的形式存放在DLL中的,因此我们可以很方便的导出这些资源。粗略的观察了一下这些文件,发现许多都是以xbm开头的,可以肯定这些是图片文件无疑。从观察的结果看,所有这些图片都有一个64byte的文件头。下面我选用了555\res02.dll中的30450资源来进一步观察。文件头如下:
78 62 6D 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 5A 00 00 00 50 00 00 00 10 0F 01 00
1F 7C 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
根据我的经验推测,文件头的数据结构大体是这样的:
struct FILE_HEAD {
BYTE ID[20]; // 图片文件标识="xbm..."
DWORD Width,Height; // 定义图片的宽和高
DWORD ColorMode; // 这个值在555时为10f10,在565时为11010,推测应该是定义颜色模式的
DWORD MaskColor; // 定义透明色的值
DWORD AlphaChannel; // 当图片带Alpha通道时,该值为1。
DWORD ImageOffset; // 当图片带Alpha通道时,该值为图片数据在文件中的偏移量。
BYTE Reserved[20]; // 暂时还没有发现这些值被使用
}
接下来的数据:
40 01 00 00 42 01 00 00 44 01 00 00 46 01 00 00
48 01 00 00 4A 01 00 00 4C 01 00 00 4E 01 00 00
50 01 00 00 52 01 00 00 54 01 00 00 56 01 00 00
58 01 00 00 5A 01 00 00 5C 01 00 00 5E 01 00 00
…… ……
这些数据排列很有规律,一共80个,应该不是图像数据,明眼人一看便知,这些是每一行图像数据在文件中的偏移量,当读入内存的时候这些值就会被加上图像数据的首地址,从而成为指向每一行图像数据的指针。这些对我们解图片用处不大,解的时候可以跳过这些数据。接下来是真正的图像数据:
B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00
B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00
B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00
B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00
B4 00 B4 00 B4 00 22 00 06 00 6A 35 8A 35 49 31
2C 00 0A 00 25 31 E9 51 C9 4D 67 3D C3 20 56 00
…… ……
从刚才的偏移量数据看出,每行的数据量都不相同,可以肯定是压缩的数据。根据我的经验判断,这些图片使用了最简单的只压缩透明色的RLE压缩算法。这个算法对于我们来说是很熟悉的,早在很多年以前(写闪电战机的时候)我就开始使用了,下面简单介绍一下。
第一个WORD数据0xB4,表示连续透明点的长度是180(怎么是180?哦,应该再除2才对),所以应该画90个透明像素点(注意:图片宽度也是90,因此第一行就已经画完了),接着转下一行,又是0xB4,接着转下一行……。下面看这行数据:
2200 0600 6A35 8A35 4931 2C00 0A00 2531 E951 C94D 673D C320 5600
0x22表示画17个透明像素点,0x6表示画3个像素点,像素数据跟在后面0x356A、0x358A、0x3149,接着再是透明点、像素点……直到一行画满为止。至此,这类图片格式就全部解拆完了,。
下面,我们再来看看带Alpha通道的图片格式,这类格式和前面一种差不多,只不过在文件头后面插入了一个Alpha通道,Alpha通道的数据是不压缩的,每个点为一个Byte宽度,因此,只要跳过Width*Height的数据就和上面的处理方法一样了。
由于时间有限,暂时我就只发现了这两种图片格式,可能还有其他没有被发现的图片格式,就靠大家去发现了。所有的数据结构也只是本人主观臆测,未必正确。另外程序我也写出来了,但是我不打算拿出来了,一来考虑到版权保护的问题,二来是想锻炼一下各位的动手能力,如果你有兴趣的话,看了上面的介绍,应该很容易写出解图片的程序。
- 相关回复 上下关系8
初到贵宝地,灌一点游戏开发的东东 4 foundera 字8835 2004-06-06 19:32:50
解拆《傲世三国》的图形文件
2D飞行射击中简单的跟踪算法 foundera 字2224 2004-06-09 21:00:40
实现一个非线性的故事 foundera 字3970 2004-06-09 20:56:25
国外专家谈游戏制作 foundera 字14961 2004-06-09 20:55:25
游戏Loading画面的实现 foundera 字1107 2004-06-09 20:42:28
游戏鼠标操作的思考 foundera 字4061 2004-06-09 20:41:46
飞行射击游戏中的碰撞检测 foundera 字5268 2004-06-09 20:28:23