三千论坛

标题: 深度解释map地图文件 [打印本页]

作者: 异仟年    时间: 2022-9-5 20:39
标题: 深度解释map地图文件
*.map 文件是记载地图信息的文件。! T2 z2 e0 Y. M0 M5 G
  G7 i3 D; s+ E3 k, l7 S
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。3 {* W: P/ z- E2 I; o5 e
$ `% g, j+ g' {8 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 l. r6 B  x) _
7 r7 Z  Q: h3 v. x: d7 ]' N03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号: _" i6 b6 t9 Q* J
07      在地表二层 12 01 这个大序列下的子序列编号
5 t0 e' j* `( w& E) \( |86      物件层的大序列# w7 k8 Q( |4 t- o4 X
00      物件层的大序列下物件的子序列编号
8 b+ i" o* N0 I0 G0 X03 03 00  目前不详, l# [6 x: B, E( a5 m% I4 C% h
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
8 N! o% U8 h1 H6 C. B
% J( [: k% c0 Z/ k5 h0 v7 ~( c//************************************************************
+ W' G! v( s2 c$ X+ _% }( _) `& U// 加载地图基本数据函数;1 D4 _, v) V: P* @7 k
//************************************************************1 p0 Y$ z; F. q; h& k- P/ a8 k
  M& g5 p6 ~# f& i: X3 |% ~
//************************************************************% q; F6 g) Z& J2 l7 v
// 加载地图基本数据函数;
* V5 i; ~% e1 O9 O9 o//************************************************************+ Q' a/ E6 R' l& M& @1 Q7 y
* u% m) D/ e8 i& N4 P. i
int Cmap:oaddata(char *filnam)6 B6 l- F; I; f* E" |
{1 T7 v( _" D* l6 i$ j1 |# Z' s
        int Temdata;
: _( R6 w& e& z  f. O; C/ K) r
5 i: _" H% |( K5 N* H1 c* b; m        if(filnam == "") return 0;
" R, t$ J7 i- T# q  p/ g# R8 ^: ?9 ?1 H2 X$ i# S
        fp_map = fopen(filnam,"rb");
7 D2 p9 s. A3 m3 X7 h7 ~
0 o, Y9 l2 U3 |( J: r" v        if(fp_map == NULL)        return 0;
6 v- R  q  g. J4 U  }
) w6 D% U! {2 I8 m3 g        fseek ( fp_map, 16, SEEK_SET);
* |) w4 O2 P( f( a9 k; a2 n7 w9 B        fread ( &ShortWidth, 4, 1, fp_map);7 \$ D" s0 }0 f9 G6 N4 v
        fread ( &Width, 4, 1, fp_map);
/ N/ l6 o% x, c+ a: |$ @        fread ( &Height, 4, 1, fp_map);! }3 j( l+ M  M% o2 _) d

( O2 Q! i; B$ E' w2 t; s( `        int TW = Width / ShortWidth;
- j; |8 F" Z$ `, ^        int TH = Height / ShortWidth;% D3 Q+ w. X0 u
5 {' Q1 y8 d% }) C  D
        for (int j = 0 ; j < Width ; j++)5 ^  j0 u# A$ p* @! d) N' F; `
        {
% P6 c7 a" V' l0 _" f                _DELETE_ARRAY(Cell);1 |5 t" I2 e3 k; g: Y3 P) a( m
                _DELETE_ARRAY(Role);
: u; x* o$ z$ C        }
( I6 i2 G& {, A! q7 ~% }' V9 @% V! m- D
        Cell = new stCell*[Width];: G' m2 Y; q7 K% y
        Role = new stRole*[Height];! s9 P/ X( j9 X$ q! z- K5 k1 T
        for (j = 0 ; j < Width ; j++)
$ d$ M7 Z1 P+ K2 `* z- `7 T( N8 U! C        {  H$ w$ R. j; j9 Y
            Cell[j] = new stCell[Height];
, I5 o% u/ \; j+ A4 y                Role[j] = new stRole[Height];        
! O+ t- ?, n5 h9 \+ C) K        }        
( v1 R( L, T) Z& J) H
' f5 D; ]5 ?: r! a! ]5 S/ C1 b        fseek ( fp_map, 28, SEEK_SET);( ^# l9 G& x) \# K. _) U: Y" H
) a- w: P2 r1 U, d. f2 _
        for (int y1 = 0; y1 < TH ; y1++)$ i/ u+ W' R3 R* A
        {
2 m% b; S8 @& V4 z% y                for (int x1 = 0; x1 < TW ; x1++)
3 `9 s7 \9 {6 h) t; L+ }: o: P                {, w% ?" e0 b/ ^8 }
                        fseek ( fp_map, 20, SEEK_CUR);
1 f! B- w& u+ ?                        for (int y2 = 0; y2 < ShortWidth ; y2++)
" F, @. q* X: e; A                        {+ s# f8 C% c' Z9 q& v
                                for (int x2 = 0; x2 < ShortWidth ; x2++)! _! p4 l6 |0 g. C1 i6 s9 }
                                {5 l9 ~% c3 T1 e1 B. U1 _
                                        fread ( &Temdata , 2, 1, fp_map);
$ s8 l( `( K5 N* o" w                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;1 Z; B: a& b5 k8 b6 Z" \

" C  A3 ~* v' P                                        fread ( &Temdata , 1, 1, fp_map);
% s- k, o* e8 [  q" K6 ]                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
+ @- P1 X8 N$ P# {% s" q% S" s$ x' |$ Y; W) D& T. c/ p
                                        fread ( &Temdata , 2, 1, fp_map);. W8 D1 \3 T, L1 }$ y; ]5 L  ]
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
( T8 V1 O9 P2 }' n5 d7 b: L, q9 U0 L2 f; j' z
                                        fread ( &Temdata , 1, 1, fp_map);! k  T% \5 L$ n% i, d8 o1 n
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;6 ]' p2 A" W" x" Y8 s! [) e& h3 V
                                        // 6个字节* e8 U' Q# Z" W+ q7 ?# t

2 e7 J1 N, \6 R' P; z8 [2 q                                        fread ( &Temdata , 1, 1, fp_map);
) `: [3 T) ?2 o$ _6 g                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;! _0 c. e( Y- |  d8 q
                                       
# ~) l5 Y9 M7 R9 C* d$ U                                        fread ( &Temdata , 1, 1, fp_map);  V7 m1 m! K8 p/ B8 E
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
# J% G; ~' ?! p/ f* n/ I$ b( F. w4 Q
                                        //fseek ( fp_map,3,SEEK_CUR);
7 N) ?3 X" B% H4 M" C" g                                        fread ( &Temdata , 1, 1, fp_map);  ^9 [' q: ^. c" ?
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;4 ?6 h; T  Z7 B. Q8 E. Y
                                        : ]9 H8 M% |* X/ O
                                        fread ( &Temdata , 2, 1, fp_map);
7 q2 f7 g( ~% I  P8 A                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
. Y, Q0 E9 R5 p- S
  y& {" K/ H' Z* z4 J" L2 a                                        // 1个字节
# U9 V2 [+ |5 I- s                                        fread ( &Temdata , 1, 1, fp_map);
0 M5 X* Y+ W) p$ c1 I2 {4 v9 g' ?                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;7 ?3 a, R2 ~2 j5 w
                                        //if (ftell(fp_map) > FilZize) return 0;0 Q8 z5 J1 Y5 Y$ ]# F
                                }
* c: Z& x* Z1 Y- ]2 T: V                        }0 W9 R! v# \# L$ q# j# g
                }
4 p6 ?4 G" @1 |, a4 q" ]7 Z        }
$ @9 @- V; B; G; O7 n. c" A3 w4 S0 m9 Z
        fclose(fp_map);2 u, O3 w7 Y# K" u5 Z+ h4 W
: G9 ?6 B. E( J4 W' U
2 v6 ]+ k0 }6 H2 H, [
        return 1;% Q. v5 k: a( @5 _
}

) i& X( y1 Z( w  x




欢迎光临 三千论坛 (http://bbs.3000y.com.cn/) Powered by Discuz! X3.4