资源预览内容
第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
亲,该文档总共3页全部预览完了,如果喜欢就下载吧!
资源描述
对传奇代码的研究心得(一) 地图篇 对传奇代码的研究,个人认为应该从地图开始,地图是整个游戏的基础,所有角色的操作都必须依赖地图来进行处理。因此从地图着手分析也是必须的。传奇地图的数据结构首先看一下传奇地图的数据结构。(注:以下所有声明均以解元版传奇代码为标准)一、 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: array0.23 of char; /保留字24end;占用52个字节。三、MAP文件地图元素定义TMapInfo = recordBkImg: 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个字节这里的注释有点不完全,因为实在无法用简单的一句注释来说明,后面画地图时会作详细解释。读取传奇地图的数据了解了上面这些,我们就可以读取传奇的地图数据了:我们构造这样一个函数:varMapFileName,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;/一个列的大小beginSetLength(MapUnit,0,0);Result := FALSE;flname := mapfile;/读MAP文件的宽度和高度if FileExists (flname) thenbeginfhandle := FileOpen (flname, fmOpenRead or fmShareDenyNone);if fhandle 0 thenbeginFileRead (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 dobeginFileSeek (fhandle, sizeof(TMapHeader) + (aline * x), 0);FileRead (fhandle, MapUnitx, 0, sizeof(TMapInfo) *MapHeight);end;FileClose (fhandle);end;end;这样就可以读取整幅地图的数据了,但在实际制作地图编辑器或者游戏中读取地图时是不能这样做的,为什么呢?道理很简单,地图大的话机器的资源要跟不上
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号