传奇地图文件格式
对传奇代码的研究
心得
信息技术培训心得 下载关于七一讲话心得体会关于国企改革心得体会关于使用希沃白板的心得体会国培计划培训心得体会
(一)
———地图篇
对传奇代码的研究,个人认为应该从地图开始,地图是整个游戏的基础,所有角色的操作都
必须依赖地图来进行处理。因此从地图着手分析也是必须的。 传奇地图的数据结构
首先看一下传奇地图的数据结构。(注:以下所有声明均以解元版传奇代码为标准)
一、 MAP文件结构
文件头:52字节
第一行第一列定义
第二行第一列定义
第三行第一列定义
。
。
。
第Width行第一列定义
第一行第二列定义
。
。
。
从这个结构我们可以看出2点:1、传奇地图文件(.Map)是由文件头(52字节)+地图width*
地图height个地图元素组成;2、传奇地图文件(.Map)是按列存储的。 二、MAP文件头定义
TMapHeader = packed record
Width : word; //宽度 2
Height : word; //高度 2
Title: array [1..16] of char; //标
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
16
UpdateDate: TDateTime; //更新日期 8
Reserved : array[0..23] of char; //保留字 24
end;
占用52个字节。
三、MAP文件地图元素定义
TMapInfo = record
BkImg: word; //底层图片索引 2 //最高位为1不可以行走,图片索引为低17
位
MidImg: word; //中间层图片索引 //图片索引为低17位
FrImg: word; //表层图片索引 //最高位为1不可以行走
DoorIndex: byte; //最高位为1有门,索引为低7位
DoorOffset: byte; //最高位为1是开,0是关
AniFrame: byte; //动画效果 (Draw Alpha)
AniTick: byte; //阴影效果
Area: byte; //表层图片对应OBJECT索引
light: byte; //雾的效果(视线)
end;
每个元素占用12个字节
这里的注释有点不完全,因为实在无法用简单的一句注释来说明,后面画地图时会作详细解
释。
读取传奇地图的数据
了解了上面这些,我们就可以读取传奇的地图数据了:
我们构造这样一个函数:
var
MapFileName,LibPath:String;//地图文件名字,素材库目录
MapWidth,MapHeight:Integer;//地图宽度、高度//以单元格为基数
MapUnit:array of array of TMapInfo; //地图元素集
function loadmap(mapfile: string): Boolean;//读取地图元素信息 var
flname: string;
fhandle: integer;
header: TMapHeader;
x,y:integer;
aline:integer;//一个列的大小
begin
SetLength(MapUnit,0,0);
Result := FALSE;
flname := mapfile;
//读MAP文件的宽度和高度
if FileExists (flname) then
begin
fhandle := FileOpen (flname, fmOpenRead or fmShareDenyNone);
if fhandle > 0 then
begin
FileRead (fhandle, header, sizeof(TMapHeader));
MapWidth := header.Width;
Mapheight := header.Height;
end;
SetLength(MapUnit,MapWidth*Sizeof(TMapInfo),MapHeight*Sizeof(TMapInfo));
aline := sizeof(TMapInfo) * MapHeight; //一个列的大小(字节数)
for x:=0 to MapWidth-1 do
begin
FileSeek (fhandle, sizeof(TMapHeader) + (aline * x)), 0);
FileRead (fhandle, MapUnit[x, 0], sizeof(TMapInfo) *MapHeight);
end;
FileClose (fhandle);
end;
end;
这样就可以读取整幅地图的数据了,但在实际制作地图编辑器或者游戏中读取地图时是不能这样做的,为什么呢,
道理很简单,地图大的话机器的资源要跟不上