三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:39
标题: 深度解释map地图文件
*.map 文件是记载地图信息的文件。
- V$ E3 I6 A' b+ G9 l) X$ h5 \7 V* n8 G+ r" J% P/ n
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。; R# B- p: B  p2 ~6 W

. u: F9 p7 W. k5 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 地表一层的序号
: U; H4 G  L1 ]9 s5 B5 K7 N/ y) q+ `2 @( r: w3 f
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
0 n; h& n8 ^8 V* o07      在地表二层 12 01 这个大序列下的子序列编号) S: t1 R# T1 |+ P  `# `5 G/ J
86      物件层的大序列
- E3 T. _2 U" w5 ~3 D9 G8 q00      物件层的大序列下物件的子序列编号8 @5 L8 t; V, ]' c) M
03 03 00  目前不详$ f% g! N; @2 T; s- J
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
" N! Q2 [" W# Z9 B# a# \* A% e( o! r  ?8 n: ?5 h
//************************************************************  k0 l9 D" _0 ]0 F/ l$ q9 O
// 加载地图基本数据函数;( B( L& f* z$ T$ c: w
//************************************************************4 E8 ~! K) |4 k, ?
8 Y# P( q  B' e& E8 |6 o
//************************************************************
; N7 X- h: J) z9 X5 `+ x// 加载地图基本数据函数;8 W$ T) n9 }5 Z# n# o- X8 U/ Q
//************************************************************
% W0 w1 {4 _1 R4 w/ z% B
. m3 o7 f4 _" D& [6 X6 ~( b! n+ M& eint Cmap:oaddata(char *filnam)
0 h" w& Z- Q6 J0 J{7 j- L. c# A* c/ i. D! W, a1 P) A
        int Temdata;
+ k- n8 r# Z! B* u
! [. M# v$ T6 |0 W8 Z; Y3 j        if(filnam == "") return 0;
4 z0 j2 m0 K0 @; N' {# I; `7 }, v/ |: q- k/ v( v
        fp_map = fopen(filnam,"rb");
' B# h4 L+ i: R, m0 N' s' |& c% {, f3 j; H6 z& P
        if(fp_map == NULL)        return 0;7 O( Y" z4 p9 f2 E* d" F# I
# n  X' w1 S5 X
        fseek ( fp_map, 16, SEEK_SET);6 P2 w6 y$ ]6 V! D6 Q+ p
        fread ( &ShortWidth, 4, 1, fp_map);, o" X6 n: o  B
        fread ( &Width, 4, 1, fp_map);5 b$ r9 q% F' U& i% c% P5 R
        fread ( &Height, 4, 1, fp_map);
$ [. Q7 m- f& B/ @0 j
. U6 z6 P* z. s( A* y! a/ A. i! Y        int TW = Width / ShortWidth;
0 h4 I. @: T) I3 ^" }        int TH = Height / ShortWidth;' t3 h) _4 w+ @1 U& _

' [& U+ J) }  u6 p  ?        for (int j = 0 ; j < Width ; j++)
( {6 ]7 r# \5 K2 I& h& a  M8 u        {
- v' |* q0 v1 K* `, i; L                _DELETE_ARRAY(Cell);6 l6 ^, C/ S+ k+ N/ X
                _DELETE_ARRAY(Role);
6 F( ~0 J2 I7 i$ _        }
1 B( I* N) P  q, V: I" P/ u8 M3 L1 Z3 e6 B
        Cell = new stCell*[Width];0 k/ X* j  G# }1 Z6 q
        Role = new stRole*[Height];$ M0 c$ M# l  |# l  `
        for (j = 0 ; j < Width ; j++)7 ]. C( Y0 H! l" z5 c" z* a( B
        {
6 Y! w% t2 v, _6 _$ L/ `5 d            Cell[j] = new stCell[Height];
0 o6 g8 l- F# c+ x6 U                Role[j] = new stRole[Height];        : h6 [& e: z, s- {( O' X
        }        9 ^, f% J& s; e5 O5 a0 n7 p! _2 b

. B  h6 _! E! H- x( B3 f' I5 P        fseek ( fp_map, 28, SEEK_SET);* s1 {6 o% |2 d# N
6 E' ?$ s: ~+ E0 e' W. i  v
        for (int y1 = 0; y1 < TH ; y1++); p7 b3 J* ~  ~" Z" b  c: l% \
        {
+ z4 v. I7 d  V                for (int x1 = 0; x1 < TW ; x1++)
: C! U$ L8 E. E' ]9 ^# b/ y# c                {& W: }# i, D( O3 p$ ~- g2 ~
                        fseek ( fp_map, 20, SEEK_CUR);
5 C+ q. c( C- L2 [; }$ f' ~                        for (int y2 = 0; y2 < ShortWidth ; y2++)
% E! S% Z/ S- z- r, `4 h9 I4 n( r- p                        {
" n6 e4 G4 a: ~' [                                for (int x2 = 0; x2 < ShortWidth ; x2++)( b) g$ ?; h+ ^. q7 m' {- k
                                {
: O/ f- \, D( u                                        fread ( &Temdata , 2, 1, fp_map);
; {2 H2 |: N5 ~# C9 j                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;6 C9 z  S/ b( F; E9 {9 Q1 l7 n$ k
: Q" I' @8 U( |% A6 K
                                        fread ( &Temdata , 1, 1, fp_map);
8 _+ R" T  T/ Z4 I! L3 J, Y                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
. N7 P" _) `% z7 H' u3 C" l* F, V8 e. F1 O
                                        fread ( &Temdata , 2, 1, fp_map);" f/ v. y( L' `" C: b% g
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
# b% t" L4 t1 o0 j1 S& `* ^3 O' ]  Q# a* L/ N( \$ p
                                        fread ( &Temdata , 1, 1, fp_map);
2 U' ]& D$ X: I" c: N7 V8 |                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;7 p$ e" z/ C$ d( v
                                        // 6个字节
3 B. m0 l9 \" K3 @% ^+ Q+ @9 x/ t# z/ ~% H8 Z
                                        fread ( &Temdata , 1, 1, fp_map);
- D" L( Z, r8 F! t                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;5 K+ ?% g$ U" r
                                       
( A) \; n7 J4 w/ J3 x  z                                        fread ( &Temdata , 1, 1, fp_map);
# E1 _9 p' {4 e1 I$ Z. [                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
; [& g' g2 K: {) R: G
  V; Y) D; |- \9 R2 S% @                                        //fseek ( fp_map,3,SEEK_CUR);
! `5 b; l* B9 f7 Q0 s9 _& d0 d                                        fread ( &Temdata , 1, 1, fp_map);3 u; H# p* d) G9 o& S* G
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;0 v; C9 t& @- U5 L
                                        9 i* x! ]1 F" b6 ?" t# v2 b
                                        fread ( &Temdata , 2, 1, fp_map);
( ?1 g7 X, p- t0 Q                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;7 F  H* g6 z* C( [
/ \1 C  ^2 W: m# x1 X0 t
                                        // 1个字节* K: z" u- t7 S/ G/ Z/ ^' o
                                        fread ( &Temdata , 1, 1, fp_map);
; `3 D! w2 I. d8 j- x                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;& `1 V, S3 A/ j) g
                                        //if (ftell(fp_map) > FilZize) return 0;
: H3 {' B4 E- h" x+ @                                }7 D# V" n8 k# K/ {% O
                        }
9 e  x4 M, G( w+ a- {                }. C$ q4 T, D/ }4 z& N* }2 V0 B
        }
$ M4 N8 O" T* r* i
+ ?* w* N7 `0 H# s" ?4 g* c        fclose(fp_map);
" K- n: _; @; d9 Z1 E; Q# ?2 l# |6 s6 m# A# J" u, ~
  ?9 y- [( M- J
        return 1;: t. [' W( N7 h/ |4 K4 W8 b" O
}

5 L& v  O' `3 |; T( M8 M




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