love2d教程22--金庸群侠资源格式解析1
昨天折腾了大半天参考了铁血丹心论坛里各位前辈的经验,还只是完成了一点,先记录一下,以后再补充。
大家可以下载金庸群侠的dosbox版(以下简称“金”),资源文件在game目录下。
一、文件纵览
“金”的文件命名很有规律,图片文件分为“.idx、.grp、.col”,分别是图片索引、图片数据、调色板。
图片索引里保存着对应图片在图片数据里的地址。若我们要载入第5幅图片,则先到.idx里其地址,软后
到对应的.grp里取数据,取出后再按调色板显示。
文件列表:
1.所有人物头像 hdgrp.grp hdgrp.idx
2.所有武功效果 eft.grp eft.idx
3.所有武功动作 fight???.grp fight???.idx
4.所有场景地图块 fmap.grp fmap.idx
5.所有外景地图块 mmap.grp mmap.idx
6.云 cloud.grp cloud.idx
7.片尾动画 kend.grp kend.idx
8.制作群信息 endword.grp endword.idx
9.256色调色板 mmap.col
二、调色板解析
把调色板Mmap.col用十六进制编辑工具(linux可以用ghexedit,windows用winhex)打开,可以看到
一共有768字节(一个字节是8个比特,即8位二进制数/2位十六进制数)。按照前辈的说法,它表示了
256种颜色,768/256=3即3个字节代表一种颜色,正是我们熟悉的rgb颜色,不过它的顺序是bgr,我
估计是大端模式的体现。而且“金”的颜色值是6位进制,要乘以4才行。
既然这个文件那么小,我便想干脆把它转换为lua的table算了。
下面是转换代码:make-color-table.lua
local f = assert(io.open(arg[1], "rb")) local block = 3 local num while true do --每次读取3个字节 local bytes = f:read(block) if not bytes then break end io.write("{") for b in string.gfind(bytes, ".") do num=tonumber(string.byte(b))*4 --把每个字节转化为number*4 io.write(tostring(num)..",") end io.write("},") end
f:close()
打开终端/cmd,输入lua make-color-table.lua MMAP.COL >>mmapcol.lua就可以生成颜色表的luatable了。
然后使用查找替换把",},",替换为",}",去掉多余的逗号。
三、idx解析
这个文件比较坑人,它的第一个地址居然是对应grp文件里的第二个图片,而且最后一个地址在grp里不存在。
它里面的地址是四个字节,也是大端模式,比如"0f ac 01 bc",实际表示的是"bc 01 ac 0f"。
解析idx就只需要逆序一下地址,并转化为十进制数。
代码暂时不贴了,等完成了grp文件的解析后一起贴出来。
作者:半山
出处:http://www.cnblogs.com/xdao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。