三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:39
标题: 深度解释map地图文件
*.map 文件是记载地图信息的文件。3 q+ \8 i4 J8 j5 |2 t( M0 ~1 x' o
8 n/ ?/ ?) V% n" @' F2 T  r
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
( d& j. W2 W1 T% O) a. Z+ u3 J8 |1 ]# w5 _9 Y
    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 地表一层的序号
4 s- S2 G' `- W  U2 f. ^/ V$ E" ~+ f- g7 b0 P9 M
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
% ]+ E3 i2 \+ z" k" ]- t( ^07      在地表二层 12 01 这个大序列下的子序列编号+ }+ D$ u/ O' N
86      物件层的大序列: h/ h& E5 }2 O: g$ q) C
00      物件层的大序列下物件的子序列编号3 O- Y2 E4 ~3 q( r! x, J
03 03 00  目前不详
9 ~  R7 `) I1 w2 x1 }' z% V01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。. |( p; r$ \/ e

/ Y, [. T/ Z) k//************************************************************! P8 G+ r8 }6 F- Y4 t) q- ^3 N
// 加载地图基本数据函数;
7 ~( N5 ]9 `5 {* R1 C4 `//************************************************************+ y8 o0 C9 t7 I5 N8 a

, M/ W0 A2 S/ w5 {//************************************************************
, k$ z2 x* F% k2 s- m( Q5 k// 加载地图基本数据函数;
; y4 I1 W- T& ?) e" ]) B//************************************************************4 R. e, A% D$ ^2 [# |
  x- _9 k+ U6 a& D) G* m4 w! Y8 m) f
int Cmap:oaddata(char *filnam)4 n9 [& ?! [) @* \! t/ O$ O7 L, n
{
3 ]( Y, N' h3 p) R9 ^2 C% B; f        int Temdata;
% w4 I  h0 e' E( I# ~4 {4 g' Z3 n# e, f4 ~, o7 j8 R6 ~
        if(filnam == "") return 0;
- \9 w& \& q$ s7 t6 v6 c4 @6 C9 z3 U  u5 N* j9 o0 a
        fp_map = fopen(filnam,"rb");
* Y3 n, u) _; ^8 e( @  X6 o3 l8 b0 |
        if(fp_map == NULL)        return 0;, q4 d2 b. O: g2 t( x. @! V
/ ^# }! e' b: ]% v  r4 ?) R/ ]
        fseek ( fp_map, 16, SEEK_SET);  B; |6 c; P! {8 j5 W
        fread ( &ShortWidth, 4, 1, fp_map);
# I2 S: k% I& D* X- q        fread ( &Width, 4, 1, fp_map);. l7 A! G5 o2 J3 Q  j
        fread ( &Height, 4, 1, fp_map);2 p. N( X' q0 c: _# y3 F. j! ~' d( O
  F5 Q* R- V0 H6 d9 I5 r7 T& Q
        int TW = Width / ShortWidth;/ k3 _! _) k4 p
        int TH = Height / ShortWidth;
) I6 E& n6 R; `: H  h8 I0 I( t
' F" t0 r1 Q/ V8 d        for (int j = 0 ; j < Width ; j++)
4 [0 T+ l4 c2 k        {3 ?' W  i) ~$ l# I( w
                _DELETE_ARRAY(Cell);( W( G. k* |% k3 u# X
                _DELETE_ARRAY(Role);
7 o* T, `( J4 }* k7 ], v+ ~        }
5 H. G$ p' e# K9 b" v! O( J
/ s- j2 z" @5 r$ t# A        Cell = new stCell*[Width];
- n7 y; u1 b* @7 v8 d+ V8 a        Role = new stRole*[Height];) @( `  x) v$ }" o5 z
        for (j = 0 ; j < Width ; j++), I  {/ N$ c& Z1 J; c3 w; Q
        {3 H2 v1 l. s; {- y2 U6 G8 L
            Cell[j] = new stCell[Height];8 r  H1 e. G( O4 E! |" j9 L: n
                Role[j] = new stRole[Height];        
% i9 q) j, U$ u7 P1 q* R3 r        }        
7 m* Z  d0 K: I% N5 _* L/ V- q+ I2 m/ R4 W4 x
        fseek ( fp_map, 28, SEEK_SET);
1 e% W! m% y. S6 i% P
* h% H' a" @8 T  |$ A3 z        for (int y1 = 0; y1 < TH ; y1++)3 \2 i/ {, b4 x* \6 q3 u# P  t8 o* y# Q
        {' p9 k5 m6 q/ ^( |9 C* v
                for (int x1 = 0; x1 < TW ; x1++): F* F; R" x: v: _$ h0 ]4 T
                {
( R9 O& T+ h' |5 V. y                        fseek ( fp_map, 20, SEEK_CUR);$ g$ E1 `8 ^; B' ]) b
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
4 i) M- T( w& x                        {0 b% E/ p' R7 a6 `6 ?4 y
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
3 G0 M4 m7 E4 N1 L: j; E3 P                                {2 _- p5 L/ }% g3 \( W  i. L2 F. [
                                        fread ( &Temdata , 2, 1, fp_map);9 q0 R9 H( R' e' ^4 l
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
8 j( c- x3 h6 q5 {" b; X
0 E/ {# h7 O2 T                                        fread ( &Temdata , 1, 1, fp_map);
! K2 d& g/ f: P/ O4 T                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;, v' _5 F/ L" ^' V
" @: ]& I( @# P/ Y
                                        fread ( &Temdata , 2, 1, fp_map);
8 r+ c( k4 p8 Z# f0 b6 |9 f3 [                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
/ h1 K: i' [5 [' c5 X  h9 m# M/ y+ w2 `
                                        fread ( &Temdata , 1, 1, fp_map);, h5 U( {  m$ Y
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
6 g4 L" P) L/ i6 ]6 Z( u, Q                                        // 6个字节5 U7 r, ^5 N& t8 j
" j% A( h3 @3 [: o
                                        fread ( &Temdata , 1, 1, fp_map);( n* m( U8 D/ Y) h; J& ^
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;. \/ j0 }3 `7 o# H' J
                                       
! J6 [7 G6 N5 M8 q2 w$ V                                        fread ( &Temdata , 1, 1, fp_map);
; U4 @$ \& p! H3 P                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;& P+ W( C% @* D) W, v8 P4 i0 X
- \5 P, i* _/ n  E2 G- M
                                        //fseek ( fp_map,3,SEEK_CUR);: u0 M0 a& R" j) l7 g3 h: Y1 E
                                        fread ( &Temdata , 1, 1, fp_map);
+ }3 w0 |7 L  ?9 Q# t/ b                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;1 s$ b  Y+ l5 F1 J0 _
                                        , z( ?. ^7 M# u9 O/ m2 Z3 X
                                        fread ( &Temdata , 2, 1, fp_map);2 f, s* |5 s! }
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
1 o& B  }3 Z7 [4 W$ I; H5 H( _9 H6 b# f; }: H9 |
                                        // 1个字节
4 M, O# ~! |) h" {' a2 H# a1 _: S  F. p                                        fread ( &Temdata , 1, 1, fp_map);
4 ~+ c( y# ]! b. Y+ E, S. G                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;5 B$ G8 y$ ?+ v% j
                                        //if (ftell(fp_map) > FilZize) return 0;3 [& k* U) B! M7 s! r+ Y+ r6 q
                                }
; v8 ]$ Q8 t( T' d% A( p                        }6 T2 `, Y5 o" S: `2 D0 A( d
                }& `5 Y  G( K8 i0 X7 }
        }" X/ `$ L- `" U+ ]5 d5 o" A0 `
6 c' ?8 Y% L& t( I3 @3 r
        fclose(fp_map);8 Y' J" V8 J2 k; b8 r  a% ~
& @' v% f& q2 c" [, H6 C
1 Q% ~9 d& C  ?$ U3 v
        return 1;! S$ b% C0 H& V0 f6 U8 @
}

8 k) h7 |4 G9 B6 D9 P- x




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