三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:39
标题: 深度解释map地图文件
*.map 文件是记载地图信息的文件。
' I; O! A. t2 a& Z8 u# k: ]3 U8 H' b9 ^8 g* O$ h
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。" ~9 H+ J8 R" O) Y8 e8 _# f
4 U' z" Z6 @; t
    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 地表一层的序号3 G, t) Z! l: Z  v* L
' H& x% S9 q2 \
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号' ~3 q3 O: ?1 x! a5 \, U! N
07      在地表二层 12 01 这个大序列下的子序列编号2 C& m' g1 e# g4 m( }& K5 N
86      物件层的大序列6 a, B* P( t6 q9 q+ L% b
00      物件层的大序列下物件的子序列编号( z$ J( C/ g4 K) @
03 03 00  目前不详
8 ?( x3 N% f) Y: q) r01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。) D, A3 C/ P. j) i% E$ k- m$ {

$ T; h' r9 j! S! b4 c. i! x//************************************************************2 A7 e; E* ]( A/ u2 k
// 加载地图基本数据函数;. N$ b( W" c8 A; O  _& x
//************************************************************' d& \! H  h& X3 y3 |% e
/ a, ~, a0 \  v2 T; g6 r- r& c
//************************************************************# o$ t" Z! r1 Y
// 加载地图基本数据函数;
% A( j( K: n  D7 D( O5 ^9 u5 ?//************************************************************. l' |8 i" E5 l$ x3 Z  J  o* w

7 w0 S, W. P, a" N! u  X' d1 ^int Cmap:oaddata(char *filnam)
( Y" [! ]* T6 D$ x7 Z  }/ W  k{
6 N" q$ T0 c# e3 H! K' ]4 s        int Temdata;
; u7 }4 K: l0 E6 Z! x. Q, X/ w5 t' X  x% I, Y
        if(filnam == "") return 0;  f. _( l3 b% @' _, a% H, e. {
8 n* y- ]) e5 i* I( J0 r
        fp_map = fopen(filnam,"rb");
! p. q. b. B. w1 W: l) f- k3 \4 J) |+ ]( r; Y
        if(fp_map == NULL)        return 0;
. k- t' x7 N' x% S! ?/ h4 [1 z1 Z; x4 r5 h* C# r4 ~* H
        fseek ( fp_map, 16, SEEK_SET);, z% P/ j6 i% O% D* ]6 Z" s5 D$ J
        fread ( &ShortWidth, 4, 1, fp_map);: x' D! m: @  ]1 q9 @: K
        fread ( &Width, 4, 1, fp_map);7 T: ]1 J& T' [
        fread ( &Height, 4, 1, fp_map);: S6 U- m* J, b/ c2 x" S0 c
7 V( Y5 L  G, B- A( u
        int TW = Width / ShortWidth;
  [# Y- @9 v7 F        int TH = Height / ShortWidth;& ~$ l4 y' `3 s
2 k2 x  ?5 R: j0 }+ L
        for (int j = 0 ; j < Width ; j++)
1 C; R, [$ k  l+ h4 q! }" K6 t        {2 Q; U/ h! H1 J5 X
                _DELETE_ARRAY(Cell);
2 F* v1 X* ]5 |5 e8 w                _DELETE_ARRAY(Role);3 ]8 y3 ]! ^2 [( F8 a; U7 P
        }! {( {4 F$ w3 d

1 M: n5 D- J! c3 S; N        Cell = new stCell*[Width];
* n2 \& i' E4 F0 R: G3 |        Role = new stRole*[Height];
0 u  G/ k! o' Q; Q1 }        for (j = 0 ; j < Width ; j++)" l5 |4 k1 N+ |% N: s+ Z- q
        {/ B( ?) ^2 Z4 W- _6 L
            Cell[j] = new stCell[Height];5 @' U  D2 S0 A7 @; v3 E( M
                Role[j] = new stRole[Height];        9 I- U7 J! }# ~' A3 m. n
        }        . P- [8 J4 r) E7 k
* s. j8 A* Z. N! V& q  l% o$ e/ i
        fseek ( fp_map, 28, SEEK_SET);
/ j' F  d2 }6 J1 g( Q  m  ^- t) ]8 w" S+ W$ `2 o' c9 a" y
        for (int y1 = 0; y1 < TH ; y1++)
6 \! @, F( Y2 s, }5 O        {. ]' @( t8 [$ B' {
                for (int x1 = 0; x1 < TW ; x1++)
/ o  s: s% ]6 k7 Z5 \                {( ?' X; @7 r5 i
                        fseek ( fp_map, 20, SEEK_CUR);
7 P6 ?8 Q8 N1 ]/ U7 M* j                        for (int y2 = 0; y2 < ShortWidth ; y2++)
  f3 B  [" L9 G                        {
0 Z" m2 w' ]4 _% X" x3 E0 P                                for (int x2 = 0; x2 < ShortWidth ; x2++)
. n% b, _/ ]' e" D                                {
# m  U( x) p5 g+ n                                        fread ( &Temdata , 2, 1, fp_map);7 R! d% ?, ~0 ]% q! ^2 _- i5 h
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
; w0 P; W) R2 O* x) B4 M  m* ]  s+ _
                                        fread ( &Temdata , 1, 1, fp_map);, I% n$ L) v% \% W9 Q
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;! s% r; s) o3 o( K; A# u; X

' o$ w/ u4 s% g. p                                        fread ( &Temdata , 2, 1, fp_map);, q5 c0 L* m/ R8 |" p0 C6 R  _
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
: A( v% G1 v- U1 X" B+ Z1 C$ I$ j& M2 u2 ]9 M
                                        fread ( &Temdata , 1, 1, fp_map);2 m$ ]9 a5 a! ]' R; M& K
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;( F0 U8 j3 g6 J
                                        // 6个字节" ?0 n2 t; G2 C: p0 X4 w
% z4 v$ R/ M9 x4 O$ i' q9 ^2 R
                                        fread ( &Temdata , 1, 1, fp_map);+ n, e* B% ?- O. r/ b5 H9 C
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;' M+ s$ m, w9 [& w9 B" {9 Y
                                       
- }: @7 ?- e$ b$ g                                        fread ( &Temdata , 1, 1, fp_map);
7 Y' E1 I; R: D8 y* Q# K2 X                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;0 L. V4 i/ N+ x: a% e; G

: O7 c8 L$ j& d# ]                                        //fseek ( fp_map,3,SEEK_CUR);5 T$ Y: _( K5 \+ E- v# k; V
                                        fread ( &Temdata , 1, 1, fp_map);
! ^- b2 ^3 e4 Q4 U6 D# v$ o! b( A                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;8 U4 p- r8 G$ g: j6 ~1 ~
                                       
/ X& |; E* _" A+ L0 y3 R. L# R) L/ ^( W6 A                                        fread ( &Temdata , 2, 1, fp_map);
5 C: G/ V; U" W$ @                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
( {. x1 H  I# C9 B% y( c
  K7 d2 t7 t$ X7 o                                        // 1个字节& {4 |6 w; i2 v" [  [0 c0 r
                                        fread ( &Temdata , 1, 1, fp_map);- Q; H6 Z2 c6 I3 o# T
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
8 p& W; ?' _) n& H& b                                        //if (ftell(fp_map) > FilZize) return 0;
& f4 a, n* J* W& r                                }
( s% ?: t/ R/ O2 B% z" }; m4 N                        }8 A5 c/ O% [. c
                }
6 @6 x2 v) i4 U+ O' a        }# Y" ?4 V2 y& e6 Q6 n1 t  o6 i, c% A

& W* N1 O/ b7 ^5 c$ O- W. y( x        fclose(fp_map);
" [  V# j# g2 q
# h) ?) Z. L5 A
7 E4 w3 T+ I# l        return 1;
& d) z! ?! x$ v. G4 p}

/ [$ P  n7 t* y: N+ R9 {




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