admin 发表于 2019-3-13 16:50:01

千年 *.map文件格式说明


   内容介绍

*.map 文件是记载地图信息的文件。
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
第2层地表就复杂一点,它是“物件”层的补偿层。“物件”是指树木、花草、房屋等东西的统称。
为什么说第 2层是“物件”层的补偿层那,因为图象显示要有前后关系,近处的覆盖远处的东西,但长在地上的花,无论离的多么近都会被覆盖,所以给加在了地表2层。
下面开始说一个实际的文件start.map,用UE打开它后会看到 16进制数据,右面对应是asc码,前7个字节的16进制数据是:“41 54 5A 4D 41 50 32”,看右侧对应的 asc码是 “ATZMAP2”,这个是地图格式标识,是说明文件格式的。之后 9个字节为空,我们跳过,不用理会。之后的 4个字节是 :“28 00 00 00”,这个宽度是组成大地图的小正方形的宽度,为什么这么说呢?看下面的图你就会明白了,比如是一个9 * 9 的大地图,是这样记录在 .map文件中的:1 1 1 2 2 2 3 3 31 1 1 2 2 2 3 3 31 1 1 2 2 2 3 3 34 4 4 5 5 5 6 6 64 4 4 5 5 5 6 6 64 4 4 5 5 5 6 6 6前面我们所说的组成大地图的小正方形的宽度(兰色那个矩阵),在这里就是 3。
我们再继续看map文件,接下来的8个字节是:“ C8 00 00 00 C8 00 00 00”,前 4个字节是这个地图的宽度,后4个字节是这个地图的高度。下面是正式开始的地图数据了,这里有一点要注意的,我们前面提到了“组成大地图的小正方形”,他们在map 文件中被记录的时候,每个这个正方形的数据前面都会空出20个字节,在读文件的时候跳过即可。地块数据由12个字节的数据来表示。
比如:“13 00 03 12 01 07 86 00 03 03 00 01”这个地块。13 00 地表一层的序号
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
07      在地表二层 12 01 这个大序列下的子序列编号
86      物件层的大序列
00      物件层的大序列下物件的子序列编号
03 03 00目前不详
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。
下面是读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
//************************************************************
// 加载地图基本数据函数;
//************************************************************

//************************************************************
// 加载地图基本数据函数;
//************************************************************

int Cmap::Loaddata(char *filnam)
{
      int Temdata;

      if(filnam == "") return 0;

      fp_map = fopen(filnam,"rb");

      if(fp_map == NULL)      return 0;

      fseek ( fp_map, 16, SEEK_SET);
      fread ( &ShortWidth, 4, 1, fp_map);
      fread ( &Width, 4, 1, fp_map);
      fread ( &Height, 4, 1, fp_map);

      int TW = Width / ShortWidth;
      int TH = Height / ShortWidth;

      for (int j = 0 ; j < Width ; j++)
      {
                _DELETE_ARRAY(Cell);
                _DELETE_ARRAY(Role);
      }

      Cell = new stCell*;
      Role = new stRole*;
      for (j = 0 ; j < Width ; j++)
      {
            Cell = new stCell;
                Role = new stRole;      
      }      

      fseek ( fp_map, 28, SEEK_SET);

      for (int y1 = 0; y1 < TH ; y1++)
      {
                for (int x1 = 0; x1 < TW ; x1++)
                {
                        fseek ( fp_map, 20, SEEK_CUR);
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
                        {
                              for (int x2 = 0; x2 < ShortWidth ; x2++)
                              {
                                        fread ( &Temdata , 2, 1, fp_map);
                                        Cell.Cell_ID1 = Temdata;

                                        fread ( &Temdata , 1, 1, fp_map);
                                        Cell.Cell_list1 = Temdata;

                                        fread ( &Temdata , 2, 1, fp_map);
                                        Cell.Cell_ID2 = Temdata;

                                        fread ( &Temdata , 1, 1, fp_map);
                                        Cell.Cell_list2 = Temdata;
                                        // 6个字节

                                        fread ( &Temdata , 1, 1, fp_map);
                                        Cell.Obj_list = Temdata;
                                       
                                        fread ( &Temdata , 1, 1, fp_map);
                                        Cell.Obj_ID = Temdata;

                                        //fseek ( fp_map,3,SEEK_CUR);
                                        fread ( &Temdata , 1, 1, fp_map);
                                        Cell.ani_list = Temdata;
                                       
                                        fread ( &Temdata , 2, 1, fp_map);
                                        Cell.ani_ID = Temdata;

                                        // 1个字节
                                        fread ( &Temdata , 1, 1, fp_map);
                                        Cell.CpType = Temdata;
                                        //if (ftell(fp_map) > FilZize) return 0;
                              }
                        }
                }
      }

      fclose(fp_map);


      return 1;
}



   内容截图



   附件下载   (如果本资源侵犯到您的权益,请联系在线管理员QQ:1589479632处理!)

十一风 发表于 2020-4-25 06:44:21

千年又得学习好久 已经扔下十几年不搞了

bitxinxin 发表于 2020-3-27 04:34:43

就像学习这种理论知识

xinxiaer 发表于 2020-2-29 18:16:16

fdsfsffdgdgddg
页: [1]
查看完整版本: 千年 *.map文件格式说明