三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:39
标题: 深度解释map地图文件
*.map 文件是记载地图信息的文件。  u: k3 J$ Q$ t, [& c# J9 \2 |
2 W, M' h! \( r$ \: X& b
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。+ t" w7 X% x' ?2 [
+ A; z9 T- Z3 Z+ B, p$ p4 M
    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 地表一层的序号* I, b% _1 U' k; |7 |

6 y, X5 G) N) P: I0 o# c) @03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
, v: r& C& o9 D07      在地表二层 12 01 这个大序列下的子序列编号
$ h' K1 h2 x: U  p& X0 m86      物件层的大序列5 R$ s3 s8 q/ o+ x$ \' Y
00      物件层的大序列下物件的子序列编号. ~3 z, u8 H# N5 ^/ F( Q
03 03 00  目前不详
/ K2 l# b  x/ m7 p; i7 w, O0 I01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
) y! g  s* x* q) l: G$ a( B4 E4 ^& m" V/ d  M
//************************************************************
9 a# A: c5 x; ]7 ?( c- o// 加载地图基本数据函数;
0 a7 e7 h* Y# `% \) l//************************************************************0 b+ P5 m. p7 j/ i" ?, ^  p

  k, V+ U7 n, d) f* V//************************************************************
, h' M7 {6 g9 L4 M// 加载地图基本数据函数;
5 Y0 P! U  j. u9 @& _//************************************************************/ b7 J! [' h9 ^
$ N3 S# s) k1 @0 f
int Cmap:oaddata(char *filnam)0 V1 S/ _( w. K% S$ Z. r3 t
{* G5 P9 k. P# r# ~4 t3 Z) q
        int Temdata;. i* n9 J) ^4 t4 T- i
/ g/ K5 b4 B! l4 L* J
        if(filnam == "") return 0;8 D" ~* z& B! Y3 M& I

% u9 _/ o& ]9 D. s: M0 C        fp_map = fopen(filnam,"rb");2 D# i* [8 M( M( i2 E5 H* Q7 K

; j0 I  }; L: R7 j& ]1 b/ @1 I        if(fp_map == NULL)        return 0;/ \5 e9 K$ o* h. x- P

2 ?! R1 a& o# I" W0 I        fseek ( fp_map, 16, SEEK_SET);
) [7 O, X7 ^2 P! g2 Z9 w        fread ( &ShortWidth, 4, 1, fp_map);
3 A5 S" W' q7 A' ]& j# b        fread ( &Width, 4, 1, fp_map);
9 }1 k" b( m, Y4 m+ a        fread ( &Height, 4, 1, fp_map);" a9 {3 R/ y5 W4 n6 L8 G% ]
# c4 I8 b, o5 g: f5 _9 C8 i7 ^2 V7 V
        int TW = Width / ShortWidth;
4 X# x& Y/ b9 Z/ F. d4 o- {% B        int TH = Height / ShortWidth;
! V" n" c; z  L# ^7 w1 O9 J; h& O+ @6 i* O8 O2 T; X
        for (int j = 0 ; j < Width ; j++)
' `' g. F3 q+ {# U! @0 t$ q+ _) N        {8 s+ f/ m$ |- a% v3 ~# G1 o4 ?/ ~. z
                _DELETE_ARRAY(Cell);
/ c2 J: _3 Y" i' o                _DELETE_ARRAY(Role);
" B. ], V: q/ j; X        }4 L* Q, Z$ \0 T+ F8 }; r8 A1 \/ H2 A
( Q# P5 c7 i2 D$ i# K! B8 N* T
        Cell = new stCell*[Width];
: c2 Y3 d" ^, I$ a        Role = new stRole*[Height];0 m. s. V" C3 ^3 c! h" a
        for (j = 0 ; j < Width ; j++)
9 D' p- X( z7 E6 ?( q        {
, j2 L8 Z; r2 y& S: q9 B8 {/ I7 y            Cell[j] = new stCell[Height];
! V% @+ W5 \% `5 E  c; \$ v                Role[j] = new stRole[Height];        
' f+ ]4 H7 w# A- t        }        . w+ g+ K8 f$ m/ S- m. D

* ?, O+ J. A% k        fseek ( fp_map, 28, SEEK_SET);3 I6 f3 u7 t9 ?& p& V- x
( J% n: R0 e6 c1 t% ^: d+ d
        for (int y1 = 0; y1 < TH ; y1++)
+ ~; A  W3 l% d        {
+ Y. [0 ^' m# ]7 f3 Q) d                for (int x1 = 0; x1 < TW ; x1++): l$ B8 s9 }; t( W) f6 A
                {: K: V7 n$ m! ]$ f2 }
                        fseek ( fp_map, 20, SEEK_CUR);* }" |& c% m% @  w( ~0 b- {, {9 b
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
  m" V( I' n( a9 L                        {+ G) T2 S% E: K- N. h$ b! c
                                for (int x2 = 0; x2 < ShortWidth ; x2++)( V6 D9 z5 L+ |3 H  d- \
                                {
% _' Z3 W! W  a- f% s$ H                                        fread ( &Temdata , 2, 1, fp_map);
: J' @9 B3 q8 j5 Y  I! n' ^! @                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;+ S1 c9 h& E5 _7 d( S
, ^2 I; m9 q2 P0 p0 u7 B( Y
                                        fread ( &Temdata , 1, 1, fp_map);9 z, Z) q$ t$ S- o0 G8 ^* L
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
; E! F! A% E0 V- w( D
* v/ }8 a7 v# |# H                                        fread ( &Temdata , 2, 1, fp_map);- h; B9 m$ s- E3 r
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;8 b2 m0 f  G5 Q- K/ S
& e9 d  D6 Q% x6 j+ O" ?
                                        fread ( &Temdata , 1, 1, fp_map);
9 X9 r0 x' g) t1 @! T; B                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
' r6 A8 N& L5 R3 v5 d                                        // 6个字节" b/ [* M( \& m2 w( J' z
1 A/ i, b! @0 X6 u
                                        fread ( &Temdata , 1, 1, fp_map);) ]5 k9 |9 h4 ?1 [! U( H2 ]
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;3 `4 z6 |! t6 `. l7 C; n
                                        0 ^  b. z. C" W2 ?; |
                                        fread ( &Temdata , 1, 1, fp_map);  f4 Y+ T8 c) s
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;' }$ q" n, x6 H! b5 R/ x/ [

- U6 P" q( [& z" |4 `                                        //fseek ( fp_map,3,SEEK_CUR);
4 P* s6 g: M2 B                                        fread ( &Temdata , 1, 1, fp_map);
# ~7 g6 ]( k( O  [* E$ F7 x/ ?                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;- }# |! s! ^. t+ n1 n! s2 l
                                       
; y$ r- L2 {5 o# v; w" d                                        fread ( &Temdata , 2, 1, fp_map);& G1 }3 e! x4 A6 S' ^" m: M
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
5 G) @, ~- h0 m2 A+ w  c# H, X+ X; Z+ t& T& @+ J# w1 [/ g
                                        // 1个字节
: {* c- W9 s( U% _! U                                        fread ( &Temdata , 1, 1, fp_map);* d- X3 h% h1 {: [. X' z) d5 v
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;  e! |; m+ ~$ R% u: J
                                        //if (ftell(fp_map) > FilZize) return 0;( I$ a  q' p& E  `( b
                                }
: b0 j+ y. x& ^& |& m- j                        }
- b7 ^- N3 m- c- f4 }- J                }
/ ?; C: q' P# D0 Q+ G4 [        }
7 Y# I' L; b# a6 r' O% ^" D
+ ^, U$ |; u$ C1 n: Y        fclose(fp_map);* c; w5 ], E* P
+ m" o: L$ R) C4 G; b2 v% H
) a% T( X. r2 E9 M3 c: c: n  D* `
        return 1;; z8 k: C0 C9 r' P% c% Y
}
2 b7 M% `, g1 @* C* a$ \





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