三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:39
标题: 深度解释map地图文件
*.map 文件是记载地图信息的文件。
* {1 A' w  j3 l- E1 [
* U" O. Q" f; V/ M9 v% w+ B7 U    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。, Q) M: p& ^! A: @$ N
& T+ G- F& A& r# B+ [0 \- K$ 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 H" j/ N* v7 L
, Z: X- J$ a2 M. l" K
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号( ]( V1 W0 W9 G7 Q6 B
07      在地表二层 12 01 这个大序列下的子序列编号
4 z% ~7 ^1 L, L" J) S% }86      物件层的大序列
/ @. c* f! Q* Z- S00      物件层的大序列下物件的子序列编号% P& {& C2 k( @0 T
03 03 00  目前不详
2 B. A' @1 V- f4 r01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。' c( ?7 {) Y) }( |; ^. Y; V
0 L- i$ k  N  \4 K
//************************************************************
  s7 {3 l( D8 p8 z// 加载地图基本数据函数;: @4 V/ p( e: ^/ c. ?6 z
//************************************************************' I& L0 i' Y* H4 D
/ G4 x6 b% C' \
//************************************************************- Q! i: i' m$ D5 J
// 加载地图基本数据函数;6 m) x" X6 u$ z9 v  G) V
//************************************************************) c/ ?6 F2 ]* s- R8 U5 D! q
% X3 M* c* `6 ^! m5 z0 M) h5 c. Z! o
int Cmap:oaddata(char *filnam)
( M- Q. ?! l# Q4 A' w3 S{
8 Q$ G8 V1 b7 ~        int Temdata;
5 R) W5 m$ x; c2 W! ^
- \8 e& }: |9 i5 Q        if(filnam == "") return 0;, v  k6 C% ~7 }$ }
; U$ G0 z9 U4 E# O4 G( |4 a
        fp_map = fopen(filnam,"rb");
7 S- ~0 d4 L, R' S5 M: `
3 T8 t) r7 R: ?. J6 C) N, `% X        if(fp_map == NULL)        return 0;
6 u  \8 X) [3 P/ r. d" B0 x* g
9 w4 p# f3 V( v9 c        fseek ( fp_map, 16, SEEK_SET);
; H1 `" ^! `9 f3 e4 f8 w: R        fread ( &ShortWidth, 4, 1, fp_map);, a. t1 \& @: s. p5 ?: u
        fread ( &Width, 4, 1, fp_map);  G8 z: i2 Q" B2 B. P( V6 k
        fread ( &Height, 4, 1, fp_map);" X' X" w9 h* T6 n( W) Q- w

$ R8 U- ^- Q0 S  ]        int TW = Width / ShortWidth;
' m& m2 S' c$ n) A4 ?        int TH = Height / ShortWidth;
2 M! r* h7 g# P9 ~7 V! R  W6 F
        for (int j = 0 ; j < Width ; j++)) s  h( V8 x6 r. j* `
        {
" F, p, |! b; D: {                _DELETE_ARRAY(Cell);: f* U- }/ Z" S
                _DELETE_ARRAY(Role);5 A% Z0 H# n+ |3 W4 c; t
        }2 Q+ \7 |  k1 j2 ^( A6 g+ }& M% r+ }

7 Y, R0 P% A" v7 i1 F        Cell = new stCell*[Width];
9 J0 a2 _* U, y, s* @        Role = new stRole*[Height];
' Z7 Z1 ]' G5 D+ ^        for (j = 0 ; j < Width ; j++)
0 E0 e. B- P$ T( ?" K, e( P        {2 g. \, h4 h. m4 i4 G! B
            Cell[j] = new stCell[Height];
- W: F$ y; N: S$ k% E8 x/ i! q7 U                Role[j] = new stRole[Height];        
, \4 r. d7 l1 i% H6 P2 L        }        # P! I# w5 e$ u1 q# ?2 `# J

- P+ j5 {2 E% C/ B8 k  O        fseek ( fp_map, 28, SEEK_SET);0 R. A! f. j$ G
% e6 M' @, o% S1 f( S/ H
        for (int y1 = 0; y1 < TH ; y1++)! Y6 r, i7 Q3 a/ W; K, c
        {. w1 S4 H4 o& q* p2 [
                for (int x1 = 0; x1 < TW ; x1++)
+ L0 ?! @5 Z( |  G5 o; U: B/ v. D                {
5 ^9 {  r  k* ]7 E# M) O" u                        fseek ( fp_map, 20, SEEK_CUR);
$ _; @" Z$ C7 ^* r                        for (int y2 = 0; y2 < ShortWidth ; y2++)+ P. c; t. G! K( f" T
                        {
( y/ E! d2 l# f                                for (int x2 = 0; x2 < ShortWidth ; x2++)  J* A4 ?! O6 s
                                {" C  l$ k2 P" f) F
                                        fread ( &Temdata , 2, 1, fp_map);9 B: q( B: I* Y  U2 R+ _- U% h- W
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;$ a, j' l, w( y2 Q+ M- \; h# j  k5 E

9 d% r6 ]" j/ A                                        fread ( &Temdata , 1, 1, fp_map);9 M* n" S  o+ m
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;; X: ~) \. ^, o: ?* z1 ?* F1 B

, R/ K' n8 B  M+ u# T  O& B" k                                        fread ( &Temdata , 2, 1, fp_map);' N: x; x$ E/ e0 K: E
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;" t0 E7 {! v9 P

8 l& i+ t; c3 q# [                                        fread ( &Temdata , 1, 1, fp_map);0 N/ g* d, J4 \
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;& A- ^! [3 _6 S! f+ `
                                        // 6个字节
8 a/ ?  w9 ]# v* M/ n7 a" S$ Y& y% }. m4 }2 S5 k
                                        fread ( &Temdata , 1, 1, fp_map);0 }0 y# Z8 l9 f( {9 q
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
8 x  g. P7 l) A$ }% U8 G, X                                        ) `8 h' p% ~" [, x- p' g
                                        fread ( &Temdata , 1, 1, fp_map);
6 L) z( F2 |' V! ?! f                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;0 C) X) T' r1 P' R5 Q

0 F0 T' G3 t0 B5 \3 `* L  ?: R                                        //fseek ( fp_map,3,SEEK_CUR);, f3 V0 @0 p, W: \& w8 W) D
                                        fread ( &Temdata , 1, 1, fp_map);
) X1 q) @+ }7 G+ d6 p                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;2 {8 ^- t5 i2 U
                                        + L- a2 ~7 @# g
                                        fread ( &Temdata , 2, 1, fp_map);# m7 w3 p! G& T
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;6 Z; N# L1 z9 ?: t6 j6 b

# ]5 D% e$ @$ L' Z1 f9 w                                        // 1个字节/ D4 [1 v1 D% o3 f8 c
                                        fread ( &Temdata , 1, 1, fp_map);
# c3 T6 k3 D  J# D                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;" s, j3 ?+ U$ P  n: i# s5 g% K
                                        //if (ftell(fp_map) > FilZize) return 0;
& A2 u, e0 R% P7 J/ M                                }/ H6 W( u7 e: t/ P9 Q
                        }) C, O( }1 b$ _4 u1 m
                }. m( {; O! _( Z7 }6 n. ^8 g3 U
        }
' d5 `8 n/ r) P
" R; _& R; ^9 ^; Z2 E: e+ B8 ?        fclose(fp_map);* x. K! c7 |! T, I# W: G
+ X# C; p3 m+ _; O5 Z+ ?) w7 T
+ h. R0 k' O$ B. V( C1 h+ B
        return 1;  w6 |  M4 M% A8 H6 o& C$ m% t
}

* t% ?7 t; ]& }' b8 z; ]4 ]/ c




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