三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:39
标题: 深度解释map地图文件
*.map 文件是记载地图信息的文件。
8 K  s+ x/ y+ t
( ?" Q. H" c- {# S) a    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
) t5 K9 k% ~! K* f/ K* d9 I
, l2 d# I) Q! L( v1 c" Y5 X8 D8 C( J    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 地表一层的序号
. @% k/ _8 z: z) M8 ?+ V; B  D& _& b8 |: b, d
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号2 d+ o% e) e: G# e
07      在地表二层 12 01 这个大序列下的子序列编号& c  ?; i0 d# H5 e6 c
86      物件层的大序列
' _" ~, N9 S9 _) d9 p2 n, h. K" c; @) E00      物件层的大序列下物件的子序列编号( v! E2 U' p1 L' ~: l2 A+ G6 L/ ?
03 03 00  目前不详$ ?$ e, _, Z8 h' ?) Z
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
, t1 v- J; h  e
; ^* C" `. l' U" G7 a" ~//************************************************************" `* ]3 W2 j" |
// 加载地图基本数据函数;
; Q% Q/ D3 q  V& B$ Q//************************************************************
3 d6 Z+ |4 O" E" B, I' \7 t, f" H' P: H4 K" o, J) p
//************************************************************5 p5 k6 ]( Y8 J; C9 W# ]" V
// 加载地图基本数据函数;
: Z% t  f' F# h% H//************************************************************
' g6 l/ K+ t  @9 H0 H7 w! H4 f# o8 H, y
int Cmap:oaddata(char *filnam)' b% K$ ^( s2 C5 H1 O
{, s2 [- h9 C; B" d- M: H
        int Temdata;
: D  h- A8 ^+ I( g& @
5 K( T; B4 j1 C" O" M; s        if(filnam == "") return 0;
. e, M$ D3 c  U4 N; @6 w) |0 b
3 x) @& S  b! l' h0 ~: r        fp_map = fopen(filnam,"rb");
( D' L3 u0 Y5 F8 |
" M. H+ W. g. t1 ~& A        if(fp_map == NULL)        return 0;
+ `; A% p% {8 j0 U+ f$ I; ~: n  p6 a, T( i8 ~; I
        fseek ( fp_map, 16, SEEK_SET);
! q9 f* y0 o- l0 q        fread ( &ShortWidth, 4, 1, fp_map);
, R: r- L1 l7 o; a+ d        fread ( &Width, 4, 1, fp_map);
/ {( T3 z4 x# z: U% @# |        fread ( &Height, 4, 1, fp_map);9 C' T7 G! ~0 b

0 p  Q) n! ~+ y' G        int TW = Width / ShortWidth;4 n  ^$ F# g- P1 s; r
        int TH = Height / ShortWidth;2 T" `/ V( d- A$ G; ~8 ^+ Q

% H7 S& ?$ I6 m- K( Z        for (int j = 0 ; j < Width ; j++)
1 g/ R: o3 p, i% j& [/ @        {7 y6 l' E, ^3 l3 q7 D
                _DELETE_ARRAY(Cell);
/ L0 Y7 a) N1 A; z8 ?) D  `                _DELETE_ARRAY(Role);; @# c7 A/ M+ O& ?, l8 s" ]
        }* I  A( @; q2 Z* B

8 X* z1 U( |/ F$ t/ Z        Cell = new stCell*[Width];
& y5 [( t7 I* J3 M" S$ }        Role = new stRole*[Height];- f- H2 f. a2 s/ ^9 D( ~
        for (j = 0 ; j < Width ; j++)# ^4 b. R* \5 |. H6 l
        {7 q% j% O7 d6 i
            Cell[j] = new stCell[Height];
* Z. l- Q# x; Y. G4 p# l( K5 {                Role[j] = new stRole[Height];        
$ m) A9 Y. ?; z  o' A' t% |        }        
, J7 y9 {0 {. V( n$ s
( W# r9 M7 O' |, l- N5 l* t        fseek ( fp_map, 28, SEEK_SET);
1 [9 L" R0 j- L, |& X, I
; I0 _( b3 h! u0 d; P* q, O9 E5 P/ D3 y        for (int y1 = 0; y1 < TH ; y1++)
: w, M7 F2 q: A/ L; P5 I) Z        {
% r" \1 Q$ i5 H# i( O* T                for (int x1 = 0; x1 < TW ; x1++)
" @! U( A! i. _7 A" L  x7 t( j, E                {5 r% N( d- p  G! {
                        fseek ( fp_map, 20, SEEK_CUR);
+ P4 ~) a+ R, F8 ~/ N+ V                        for (int y2 = 0; y2 < ShortWidth ; y2++)
$ H5 K8 s) `1 Y                        {: |* x& i- L6 J) a; ~
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
, g1 P1 W& A- C# U: v                                {
/ {) F; [, c3 Y0 @+ C: N/ y  m                                        fread ( &Temdata , 2, 1, fp_map);
7 V0 Y" a  k" L& y% O                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;. c7 B/ X' h9 Y9 L' ~# @

" E$ d9 E6 M7 j0 v& ?                                        fread ( &Temdata , 1, 1, fp_map);
5 c8 k" z" u% y$ M                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;" I( W4 z6 }& ]2 G8 F4 M- r
' B! ^8 ?3 t0 X7 Z/ o) W
                                        fread ( &Temdata , 2, 1, fp_map);
) X, B" A$ `, w" B                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;: R+ H$ q: c3 n5 d6 j
& {* D0 P  v4 a* [1 ~
                                        fread ( &Temdata , 1, 1, fp_map);, P" L/ g6 e0 M9 m
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;: w5 E1 L7 V% l2 V# A+ N
                                        // 6个字节, f: c& J/ M" w4 Z7 ~: r
5 x4 T, D, z. A" z
                                        fread ( &Temdata , 1, 1, fp_map);) J- e9 b0 f+ a9 j$ }
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;' M4 b& p" y6 H
                                        $ F% N' I4 }5 J8 q2 e
                                        fread ( &Temdata , 1, 1, fp_map);+ ]0 a$ N) c. \5 B2 g0 Y) j; e
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;3 y3 g. u- U5 ^0 W: i7 d

5 e: ~+ n( S+ X4 `                                        //fseek ( fp_map,3,SEEK_CUR);5 r; P$ ]: X7 P7 W; C, `* }- H! {' I
                                        fread ( &Temdata , 1, 1, fp_map);
7 G/ z9 g6 J! i% K$ b/ Y; r1 Y' \                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
0 A& M  x& j+ v3 l/ ?4 n, {, z0 e, ~                                        ( Y. A. s  f- p  v
                                        fread ( &Temdata , 2, 1, fp_map);, j, _% ~7 Y. ]6 O3 \3 s- T$ D
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
8 S  m9 K+ \9 q2 P  g( |! D7 v  Y' W1 z+ i, e0 E
                                        // 1个字节
9 D! _: a7 C$ T2 l! r1 b                                        fread ( &Temdata , 1, 1, fp_map);
. C& ~/ t; y* A                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;5 p; Q, v/ o" u6 S/ V
                                        //if (ftell(fp_map) > FilZize) return 0;
$ U5 b, `; |7 l, A                                }
3 s- D# M) Y( v$ r9 N% S3 f                        }- D4 c7 h; j) q; g" u  B
                }
5 r6 F: T. F  r1 [" I. l. x7 ]        }' G8 a9 D" B6 `

+ Y! k3 a* A" |: ?  [        fclose(fp_map);
" L, E6 S7 D5 {$ b: ^& E3 D0 ^
4 j- r. `( d4 N8 }+ O$ i- c( q3 g! G1 l
        return 1;: k/ h. ]- v. t  d* u0 U3 d0 j
}

( i0 ~" @) _$ c9 G. }$ w7 P




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