游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4884|回复: 2

对传奇代码的研究心得(一)

[复制链接]

6

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2004-7-8 21:33:00 | 显示全部楼层 |阅读模式
                                                 ———地图篇

对传奇代码的研究,个人认为应该从地图开始,地图是整个游戏的基础,所有角色的操作都必须依赖地图来进行处理。因此从地图着手分析也是必须的。

传奇地图的数据结构

首先看一下传奇地图的数据结构。(注:以下所有声明均以解元版传奇代码为标准)
一、 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;

这样就可以读取整幅地图的数据了,但在实际制作地图编辑器或者游戏中读取地图时是不能这样做的,为什么呢?
道理很简单,地图大的话机器的资源要跟不上。


22

主题

115

帖子

115

积分

注册会员

Rank: 2

积分
115
发表于 2004-7-9 20:21:00 | 显示全部楼层

Re:对传奇代码的研究心得(一)

好,不错,继续!!!!!

33

主题

445

帖子

446

积分

中级会员

Rank: 3Rank: 3

积分
446
发表于 2004-7-10 02:46:00 | 显示全部楼层

Re:对传奇代码的研究心得(一)

累不累
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-3 17:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表