游客您好
  • 点击联系客服

    在线时间:8:30-18:00

    客服微信

    Wkr-3000y-kf

    电子邮件

    3000y@wenkeruan.com
  • 手机版

    随时掌握游戏动态

  • 扫一扫二维码

    添加微信客服

Lv.7 版主
8号会员,9活跃值,2022.09.01 加入
  • 127发帖
  • 123主题
  • 0关注
  • 0粉丝
这个人很懒,什么也没有留下。
独家推荐 更多>

深度解释map地图文件

[复制链接]
异仟年认证商人 发表于 2022-9-5 20:39:53 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
*.map 文件是记载地图信息的文件。' B  [$ n0 e/ a) M
: Y( S) }5 A  j8 }7 E  S  m
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
4 a( {4 u. p- E- e! |* t/ N8 s& z! |" ?7 s) h3 I2 k
    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 地表一层的序号
0 q* Y; ~: D6 k2 _
# r. y, U+ |2 e! ~& ~3 O! f- r03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
4 o. d0 w& X& C( {0 ?9 g07      在地表二层 12 01 这个大序列下的子序列编号0 w% D! Y0 {$ r& C) [6 M, B
86      物件层的大序列
# _) O& x" _! G1 c3 I0 f4 t% p) u/ j" P% S00      物件层的大序列下物件的子序列编号0 m4 w$ S5 y; d; N' P" Q
03 03 00  目前不详
- \- M/ y+ q' m. F9 b2 C% D01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
% h6 B+ e2 m3 C* I% \8 I7 u8 e" n5 ~7 W: d
//************************************************************
$ Q* F$ G$ A! H- I$ R// 加载地图基本数据函数;
* y" b4 N& c1 k6 P4 ]//************************************************************6 u/ K' t6 a) N1 }0 |

3 x. `% D7 T7 N4 J//************************************************************  `+ y2 ]9 ~% I
// 加载地图基本数据函数;
4 }4 V. c+ D. |8 p9 [$ L0 n3 C//************************************************************
$ s- A/ g- e5 W5 O& w0 X) I
$ v" g. O3 a0 V  n6 Qint Cmap:oaddata(char *filnam)
& g! m5 m0 N! X{, @- J) ?  q: G; o: d" a" d$ }
        int Temdata;
; ?1 a$ r# I- }' G
2 B8 e8 k$ y% {' j# V! J        if(filnam == "") return 0;
5 h2 w  M0 ^8 f; D# x! h9 d' [6 p- q7 a! U  u6 N: |5 o
        fp_map = fopen(filnam,"rb");" j3 X$ U, `3 k" z
, B/ F, U& |9 S# c9 ^( P
        if(fp_map == NULL)        return 0;
4 v+ I- V4 U1 n, }
% D6 ?8 C+ b3 J% k+ [; n        fseek ( fp_map, 16, SEEK_SET);, @! l# ~5 M, n1 y& d, [" d+ u
        fread ( &ShortWidth, 4, 1, fp_map);" B$ E/ b2 w1 t* Z* I5 m
        fread ( &Width, 4, 1, fp_map);7 J8 s: ?) I7 K6 E* m3 f: ]
        fread ( &Height, 4, 1, fp_map);9 d! u! g4 {( [

- t7 {) O& u5 w( f' r5 D2 Y        int TW = Width / ShortWidth;
- |% U' p# v' @3 N! k7 ^3 r3 q        int TH = Height / ShortWidth;
$ E- W+ U. W( `3 I$ C
- F+ L7 @9 E2 r$ j6 ^( z/ ~        for (int j = 0 ; j < Width ; j++)
. b4 B. n1 `5 m        {3 X& J+ K7 L1 _1 d
                _DELETE_ARRAY(Cell);2 B) a1 d* \1 W$ B
                _DELETE_ARRAY(Role);7 E3 L9 e) u; Q4 a6 \
        }
+ {9 S$ h, u% n) `3 V" |( S1 n" M1 K
        Cell = new stCell*[Width];
! S/ ]. X& k# m        Role = new stRole*[Height];8 _; R# ]6 U, n5 s
        for (j = 0 ; j < Width ; j++)
9 _1 J8 M* c+ z4 B; v        {8 J7 w# P# [4 y, z0 e$ o
            Cell[j] = new stCell[Height];
7 k& e% G: \: x                Role[j] = new stRole[Height];        / l+ K: {( f) j2 ^
        }        
: x3 V2 U  ~( t
1 T- y6 U# z8 w' g/ c: p1 T        fseek ( fp_map, 28, SEEK_SET);  L# z1 n1 d8 j+ I

/ l8 ~( j; @- U        for (int y1 = 0; y1 < TH ; y1++)
$ e  i* L- s9 X! \' h  U, \        {: p4 o4 L) n! U7 U# y
                for (int x1 = 0; x1 < TW ; x1++). s3 c! B. H1 W8 r% d+ c7 q! r: X
                {
6 g7 f2 X6 s/ ?1 T# ]2 q1 s! `+ A  [                        fseek ( fp_map, 20, SEEK_CUR);
4 G. i9 y# n9 u7 |                        for (int y2 = 0; y2 < ShortWidth ; y2++)% i4 ~! b7 B( _4 C( m- |5 H
                        {* }6 o! _/ F6 _1 W' w
                                for (int x2 = 0; x2 < ShortWidth ; x2++)+ `1 I' I# w. c" T
                                {
, l3 |& D! j: X                                        fread ( &Temdata , 2, 1, fp_map);
) u8 X1 g: P: i  C: P                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
# Y2 }& b2 c3 u+ H9 V/ Q$ k$ E# _4 F% E4 [3 K- ]
                                        fread ( &Temdata , 1, 1, fp_map);! E+ [& Q" D" h! z* `
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;2 Q6 T& y8 z( R" K, _% V' o
& s( u( F+ Y7 h7 d- Y* d, w" E
                                        fread ( &Temdata , 2, 1, fp_map);7 }# X' o* B( G7 M) V
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;. Y- j* q0 L1 X6 q1 I5 i7 Y. u! J
6 H- G' F0 d' C0 U
                                        fread ( &Temdata , 1, 1, fp_map);* n3 G. S" Q& Y, J2 \. V
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
" N' p% P7 Y0 }* e1 I/ V* b5 q. W                                        // 6个字节" G7 `; ]7 {3 c( X2 O5 {
1 T1 [% I( Q- \4 {
                                        fread ( &Temdata , 1, 1, fp_map);( e$ W$ U! N1 s1 Z: y
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
$ X% s, }/ M; K                                        - p3 l0 M3 f  N" A- Z$ H/ O
                                        fread ( &Temdata , 1, 1, fp_map);% y% `* z' P" a) O
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;4 Z1 h2 p8 D. |4 }; l' Q  }( e: [# \
0 e7 Z! T  Z7 V1 L
                                        //fseek ( fp_map,3,SEEK_CUR);
5 X. t4 L1 d1 Q1 M. Z& r                                        fread ( &Temdata , 1, 1, fp_map);
7 s0 S, {' ~% I1 ?' b                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;) r7 w& }6 e- f  [
                                        $ t& P, z. n/ W) i. O' g) e
                                        fread ( &Temdata , 2, 1, fp_map);! y" f% j5 n$ V" ]
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
& K9 b2 A' ?3 c- m  {- K# h0 `6 r3 ]2 J6 |! J1 K" v
                                        // 1个字节
2 H9 P/ g! F4 |4 O                                        fread ( &Temdata , 1, 1, fp_map);3 T; y' y" Z% G+ e9 K
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;! u% U1 t5 l4 j* E! |
                                        //if (ftell(fp_map) > FilZize) return 0;
3 w& @' c! i# |/ r/ [$ H                                }
! Q: ~5 D, S3 t: Z8 G3 {  S                        }& H4 I# D( [, f6 i
                }) O6 h0 s6 K+ w" t3 ^
        }
; b- K0 _" _$ ?( K4 n" K: }
8 R* S% I3 ]2 a& q( w+ Z        fclose(fp_map);
* Q! A+ p8 i3 ^0 n( t) O0 ^3 {$ G  V2 @: f% L4 o' B: y

" o: B* {" z: C2 o        return 1;
- ^( }$ H% D/ K  j  t6 ?, ^}

. Q" \8 K* {; O7 Z7 E- H$ n
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

Powered by Discuz!X3.4 ©2001-2013 Comsenz Inc.闽公网安备 35099902000100号增值电信业务经营许可证 闽B2-20220593 闽ICP备2023014375号