三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:39
标题: 深度解释map地图文件
*.map 文件是记载地图信息的文件。/ B% a- G9 E1 [: M6 X6 i/ X% F
! E* `; |* D2 _( M
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。& p5 x. g9 u+ ~6 ]

9 X3 K  C. r# E2 S! I0 X3 [' e4 r! C    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 地表一层的序号! F/ ?6 k  z. P  }3 @- X5 p

# N8 x+ l2 H4 v: F( m03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号. B0 _2 R9 D# B$ u% g& d5 y' A& O
07      在地表二层 12 01 这个大序列下的子序列编号
6 i/ n3 g% u1 p* w0 l3 P0 O9 C86      物件层的大序列5 B! f  I7 y1 S8 M, ?
00      物件层的大序列下物件的子序列编号4 O  `: y$ A$ c- l7 m7 s$ B2 R
03 03 00  目前不详+ H( b, p! r' T3 N  S# _5 r
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
; C2 A2 _* G5 }: j( W7 O0 K: G/ L: B1 y4 {* b( M4 L
//************************************************************' U2 W2 t- ^( d& N
// 加载地图基本数据函数;' J$ i: ?! O2 R9 P2 [
//************************************************************
% t. O: N( `  ^3 V3 G- A6 U" O! S+ r$ b1 l7 F% }' j9 M
//************************************************************
8 E( H7 C# g7 [// 加载地图基本数据函数;
# m  R# w$ b4 T9 ]) I//************************************************************
$ i0 }' k* q5 S) O. r" M" j! t5 R! ]" K2 o, V# y
int Cmap:oaddata(char *filnam)  t  A# ^6 W; @: N  X+ V
{  ^# M1 u" r  s- y6 F  ^* ^# t
        int Temdata;
: ?) x9 r1 K% e+ \! c+ T9 J+ b8 Q/ O# V+ u" f! ~
        if(filnam == "") return 0;
! M7 V0 l9 a/ `* W3 B" N1 n* Y: e% x, B
        fp_map = fopen(filnam,"rb");) E6 s+ z6 z% A0 A8 h5 m! L" }! d
, P# n. q7 e9 l2 F2 E' K: b
        if(fp_map == NULL)        return 0;" @( g" j, s5 Q/ c* ^1 K& b9 g
/ n0 p  z: w' _, |. e: i) R6 n6 E( A
        fseek ( fp_map, 16, SEEK_SET);
0 r5 H$ g# E, `8 d: {. i        fread ( &ShortWidth, 4, 1, fp_map);
% ?; W8 E. c! I2 |: A        fread ( &Width, 4, 1, fp_map);
2 q& W1 w! ^1 L& t% C' A! G        fread ( &Height, 4, 1, fp_map);  w$ }* J  k4 u3 Q$ @# L
( w' ?4 ?! \1 s# Q
        int TW = Width / ShortWidth;
- w7 [3 u5 L/ H% A+ W8 G8 h& K        int TH = Height / ShortWidth;
  ]/ n" i( s1 |; E' G% m. @, |8 t. w' C7 N
        for (int j = 0 ; j < Width ; j++)
) m/ f2 @# m4 V) R' r/ z  v        {+ r( T' H2 o; D  d" a
                _DELETE_ARRAY(Cell);1 k; d% z8 ?% E
                _DELETE_ARRAY(Role);
: T1 [. k# X3 q! \: j( }# A8 a        }
2 A4 q' q! o% x
. a( s) t; l7 H1 T; G        Cell = new stCell*[Width];
  C& j$ }; @- M  B        Role = new stRole*[Height];
  R1 \8 ?: g0 T0 x$ \# c: S        for (j = 0 ; j < Width ; j++)' o3 F$ ?: v( ~3 ~  Q
        {  n2 ?0 v0 C4 J# W3 p
            Cell[j] = new stCell[Height];
  b: o. f+ ^9 h8 t- r! T1 E- t                Role[j] = new stRole[Height];        . U8 `# s: E( G! K+ l' G
        }        - O- F% ]. g6 ~# n/ l" m6 }

, i: t$ g1 E" e/ \1 i0 z# o        fseek ( fp_map, 28, SEEK_SET);
! U& C! m- C0 C0 x6 W% Q0 T7 [6 {, x" ^! g$ f9 _
        for (int y1 = 0; y1 < TH ; y1++)+ h. E6 G, i( x6 o: D
        {& d7 W3 I& G) R
                for (int x1 = 0; x1 < TW ; x1++)
/ S- m, O9 o( V/ V                {
( h" a) k/ G% y. g. }- G                        fseek ( fp_map, 20, SEEK_CUR);0 J& a, g: z$ b+ S
                        for (int y2 = 0; y2 < ShortWidth ; y2++): _  `/ F) x5 u
                        {5 n3 E" ]+ q7 m4 D( y8 ^
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
5 @, A5 d, D# X) q6 c                                {8 X9 q0 c/ N6 x: k. F; P# L) t. w3 a" @
                                        fread ( &Temdata , 2, 1, fp_map);
7 x% h1 t5 c0 E' d# L0 r                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
4 r) [( Y7 T5 Q
' C! n' R6 T5 T8 M2 X* q3 |3 r/ i                                        fread ( &Temdata , 1, 1, fp_map);. D8 f* x8 W# c: R) ]/ h+ w
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;( |" U) T* W0 u& x' X

1 f) X: o$ n% m6 w                                        fread ( &Temdata , 2, 1, fp_map);# P/ k9 m* O( A) H. }* ?8 W3 ]
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
. F% ^' h0 C5 W) ^& E
- Q) t/ k2 T+ U                                        fread ( &Temdata , 1, 1, fp_map);
8 A+ Z% ]. B, F( y2 F; D3 ^4 R                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;4 V5 ?2 D7 r$ A- U' P2 H
                                        // 6个字节
8 Z! J, a8 n8 G+ Z+ T- E/ g" _4 }
+ s3 n" O% H- z5 m2 o6 ]& N                                        fread ( &Temdata , 1, 1, fp_map);
3 ^0 q& \  u, w* V- r8 O( e% a4 ~                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
' K/ [% y  D- ^  `9 {" u3 p                                        9 X3 _! b! a  H4 H: s) n$ K+ N1 A- d1 [9 e
                                        fread ( &Temdata , 1, 1, fp_map);
; T4 w* x* W# J                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
8 U* A0 v# n/ l1 H4 Z6 p* Q6 G) a& g3 t( w* _, n  ?2 h, }" J; N
                                        //fseek ( fp_map,3,SEEK_CUR);1 `3 _! A7 E; A# E0 @
                                        fread ( &Temdata , 1, 1, fp_map);. a+ @" P. s3 n7 Z# {0 c
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
( _( v2 c, |+ C& `* }1 Q- F0 M0 O' c                                        5 n' O, J9 G7 X& }( Z" e+ S9 W
                                        fread ( &Temdata , 2, 1, fp_map);6 i6 F- n% W+ M2 c3 U2 V
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;: I6 g4 s# q+ Q1 Q" S
! [4 p2 R: [+ m2 P7 I- U
                                        // 1个字节
5 O4 w8 l0 J! s& v" m, }                                        fread ( &Temdata , 1, 1, fp_map);
, Q+ ^7 c4 H( B3 g9 A                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
8 a$ i0 n6 T, L. A& o                                        //if (ftell(fp_map) > FilZize) return 0;  A0 d9 @9 u* p, Y* C
                                }( A! Q0 V  y6 t8 K7 g$ |; g/ m+ J
                        }
7 `1 S( E& c$ r. y' [8 ^; m! x                }0 S" {, K% g0 `) ]4 y- g5 W
        }
' E5 v2 _; v4 S+ _+ D& O. ]8 r0 g' m" h2 R" I, }, a- v; \2 S
        fclose(fp_map);$ l; b9 B; j( _) z" G

( ]3 U. {- {. r5 d% |
$ C3 P" H, `, s$ b, S* S- {        return 1;
/ b; }8 n7 B$ r5 M6 r}
) N: ?; L$ Z0 Z" n





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