三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:39
标题: 深度解释map地图文件
*.map 文件是记载地图信息的文件。1 U8 s! W: E- N3 t! x

: p$ p" g' n$ @1 [1 P, I) S8 {3 W/ R  n    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
& c+ v) R" B: Q+ W7 r
3 z' z( ]9 _6 I3 y    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 r1 R" ?8 `5 |5 ]) d
/ i; h, x* G. U4 h
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
  p: D% H9 W3 R: Q4 I1 u" q8 _07      在地表二层 12 01 这个大序列下的子序列编号
4 `% w) i% Y% p9 @8 P86      物件层的大序列- }: b- Y) p# b. `
00      物件层的大序列下物件的子序列编号
; I/ I' t9 z- A& f03 03 00  目前不详
5 ?0 \+ ?! w0 ?. L* N01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。% i2 _- Y9 Z9 j- a! v
# X4 t% t- z/ }3 u3 P. f, u8 f
//************************************************************
6 o  q6 q5 z# U8 k4 o% ?// 加载地图基本数据函数;
& p, R5 E  [8 u( V//************************************************************
" o6 t. R4 h8 q% p0 j' h: H! V# i. C) D& _  I/ h# g% B
//************************************************************- Y8 L) n- x* t+ T
// 加载地图基本数据函数;
! b8 l' [. }+ p* e( O& h* O3 ^//************************************************************6 z' V7 M* D% y/ C6 |8 v" r

' a) u; O3 @  Y% iint Cmap:oaddata(char *filnam)8 \$ K* k) f( S! k2 _
{
9 j* W# E3 \2 R1 Q' I+ Q/ j        int Temdata;
. W" f9 X2 F" j3 S8 z3 d0 o
; U/ J  n5 V7 `  t/ w* q        if(filnam == "") return 0;
7 U( S3 q; d$ A- m5 \+ s6 `( V$ u9 w/ w! w
        fp_map = fopen(filnam,"rb");
) R' D" Z4 \- k# a/ I: q+ u
# @* q5 K8 t3 j% m7 v        if(fp_map == NULL)        return 0;* N& p* o& f! J( t. p* r1 r

; k% L; T+ K0 z        fseek ( fp_map, 16, SEEK_SET);$ [2 G2 z1 t4 B6 I0 w: w
        fread ( &ShortWidth, 4, 1, fp_map);
  G1 R  Y. a, o' F6 t        fread ( &Width, 4, 1, fp_map);' r- `. Q$ n# }5 U. m; s; `. \
        fread ( &Height, 4, 1, fp_map);& h5 F8 s9 _1 S3 L* I+ {" U" a' g
8 Y+ d9 M1 P9 C) \; d: L9 a
        int TW = Width / ShortWidth;6 c0 r" x, H5 ^
        int TH = Height / ShortWidth;% ]* a, ^9 H. ^$ g% w) w
# y, y) h# ?+ y2 B7 l
        for (int j = 0 ; j < Width ; j++)6 L" e6 \5 T4 n& ?0 S: E9 d# t' \7 a
        {% I, {4 p: B8 r0 _! e7 T5 C6 L0 w: u
                _DELETE_ARRAY(Cell);
1 }7 h- l* [' y) E7 L. I                _DELETE_ARRAY(Role);9 _0 O4 L3 J) P' d' u, q$ o
        }
6 C' o# r- I3 g# j  Y! p
$ c( I3 {/ \- ]! _; _: E        Cell = new stCell*[Width];
* i; G; [& N& D- f" L5 {        Role = new stRole*[Height];/ ?7 q; p( S9 e) y- I
        for (j = 0 ; j < Width ; j++)
3 l" ]7 j- k2 O        {
, ^7 v4 I. y. o( ]- [            Cell[j] = new stCell[Height];
, O" C' M+ w9 f+ F7 P1 A7 J                Role[j] = new stRole[Height];        
" [) Y7 \# H6 c5 f4 k5 ~        }        
' q% _' E# c$ O1 w! ~
1 a) R, \2 ^( v0 z0 {) K+ U0 ]) o        fseek ( fp_map, 28, SEEK_SET);6 N) e3 P* z5 A3 W
/ L8 @- o# L6 G8 C, |
        for (int y1 = 0; y1 < TH ; y1++)2 N8 V) T$ G3 Z# U  K: l6 [
        {8 Z0 N# B& V  Y1 C  J
                for (int x1 = 0; x1 < TW ; x1++)
; j7 `. M1 l& ~/ K6 W8 O/ p                {  [% I8 d, O/ t2 E' R
                        fseek ( fp_map, 20, SEEK_CUR);
" T6 f2 Z0 z0 g) H& Z' c                        for (int y2 = 0; y2 < ShortWidth ; y2++)4 L# _5 ]5 j) }% l( r: _
                        {
9 ]  N# S8 p) y( t                                for (int x2 = 0; x2 < ShortWidth ; x2++)$ a/ Z: k- ~+ y+ z
                                {. o: a" N; I. c0 m6 ~' ~! V; t0 m2 v
                                        fread ( &Temdata , 2, 1, fp_map);
4 n; e- v9 r( A0 z! m5 F* D                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
/ e3 g4 D3 \; K0 d3 F
8 E( u* _! v. j; }8 S) U2 S                                        fread ( &Temdata , 1, 1, fp_map);
9 R* ~$ i* j5 Q' q5 \# ?7 }0 [                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
3 c9 F: t* o: ^, p$ U( L% o5 L/ J1 H( W& @) H
                                        fread ( &Temdata , 2, 1, fp_map);5 c/ m: w. U. K4 s2 G9 A
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
% m* ?% m, b, ?; J! O" ^( ]: Q6 P0 S5 n0 J1 x3 [5 {! l
                                        fread ( &Temdata , 1, 1, fp_map);
  G. i. o" j2 u' j                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
- H! x9 b; L& E/ C' A* F! r3 N6 g                                        // 6个字节
0 U: K" ~% W  Z1 `! y8 U7 Y
. B5 {( N9 c# E# e# `                                        fread ( &Temdata , 1, 1, fp_map);
" r: c$ u" S' Z; f. O# W" ~                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
( W$ }3 |4 r- }6 G                                       
1 |6 V: {$ M8 a( A; W9 z! v8 L. `                                        fread ( &Temdata , 1, 1, fp_map);
! u! J" `9 A4 V8 ?; U, g. i                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;3 u  Q$ p; s1 k1 M
1 r/ q6 u5 o  A' L
                                        //fseek ( fp_map,3,SEEK_CUR);
9 U0 ~3 H6 R) u) q' _                                        fread ( &Temdata , 1, 1, fp_map);' v) P. B% F& b, l" Q/ {9 U1 h6 E  C
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;3 L- d2 K% ^, n. y/ g4 `  c: ~* [& a
                                       
# j% W6 k- i2 c. b4 R                                        fread ( &Temdata , 2, 1, fp_map);
8 }( D6 i. Q: s* t' R% n                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
# }' k  b& K8 i& ~: j0 ?6 L5 N1 m- W; A# t4 N4 V* v  ]8 P- @
                                        // 1个字节7 O# \$ z1 W! `9 [
                                        fread ( &Temdata , 1, 1, fp_map);- I0 u! u$ }6 [9 Q4 |
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
  l8 \$ H9 {( S0 ?                                        //if (ftell(fp_map) > FilZize) return 0;/ {, ?) _, C/ j4 }- K
                                }
% S/ @/ M& D! M) n" s% j                        }6 _& b) R- j8 b+ Q
                }1 q/ l3 b5 U6 D# I- P$ G
        }
4 K9 d8 c$ Y* S# s
: A/ A: X1 }) }9 A. j/ w        fclose(fp_map);7 {2 C: p) k) L3 a

. Z  z- w2 g( u0 B
% L, P3 v! n4 n2 g% a9 ?        return 1;2 s" O6 g7 ]+ \5 e
}
8 \& k6 A3 J7 ?% J% \5 P+ J6 K





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