*.map 文件是记载地图信息的文件。) D! K. \9 i+ H% R4 m
: l6 r3 D8 ~* Q( x' J
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
/ b/ O" ^5 L+ r& S9 u, S
+ \4 j" Q8 O# H( D7 _6 O( x 第 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 F9 [- w0 C- T' i: d1 [) [6 e
. F, V; m$ F# ^ Z& ]+ a! v3 t7 D03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
; d; [9 _* J8 N07 在地表二层 12 01 这个大序列下的子序列编号
* u9 _8 p6 s) a; T86 物件层的大序列
8 C- f" A- t6 ]: Y7 X" k D00 物件层的大序列下物件的子序列编号
& S: s9 m5 E' h$ `: d03 03 00 目前不详2 h4 z7 u( s1 I4 M A* |) ^
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。3 E* o+ i: v& Q* i. g. S( S: s- g! L
g3 p" h; p+ t4 @& {
//************************************************************
; e+ A/ u) S7 G( [// 加载地图基本数据函数;5 O) e3 X& q& ~- g% ? Q$ Z* p6 K
//************************************************************
& M: K+ a$ U! l- i0 H* \1 Q: \8 V8 E1 o8 N
//************************************************************6 A' o) f6 R: J; _& o
// 加载地图基本数据函数;7 s7 v- L4 q; T9 m
//************************************************************
9 @, R5 C: u' I% n( [
0 T) N' j# H7 A5 K1 Vint Cmap: oaddata(char *filnam)
+ P6 u. W$ @3 \: n3 n( F) x{0 x, L* f/ d/ n2 e
int Temdata;# `; l& X. u+ r- J
3 L# G6 H+ L; T- e* f4 ?) }0 w
if(filnam == "") return 0;: R/ z+ T( t ^; e
2 q: P: h: _. q: ?$ h9 b fp_map = fopen(filnam,"rb");
8 W6 W% i2 O2 u, k$ E
7 u+ F- \+ ]! b a if(fp_map == NULL) return 0;
! y8 a; N% ], c- {+ E- f0 k: o8 r6 d" U( _/ y8 r, r5 R0 f
fseek ( fp_map, 16, SEEK_SET);
: o$ X( I. ~% |+ m7 ^' F" C fread ( &ShortWidth, 4, 1, fp_map);
; Z9 Z1 N/ C: \- s% v$ z; K9 s fread ( &Width, 4, 1, fp_map);
6 ]/ e: a- o' t3 |9 u fread ( &Height, 4, 1, fp_map);
% w0 k9 ]7 c5 \8 |7 J' i# v. \. j9 Q+ M/ q& P! T \
int TW = Width / ShortWidth;
5 X5 n8 Y( X, C1 f" P) Z int TH = Height / ShortWidth;
% l2 l" U/ }$ q8 H6 k9 U
, m, X% h- c- s6 O9 y for (int j = 0 ; j < Width ; j++)8 K# P. ^) j, y$ ~! m$ P
{
- ?- j/ Q- j1 V _DELETE_ARRAY(Cell);
6 |% H4 ?/ U+ B+ K4 l5 V! X _DELETE_ARRAY(Role);9 E' N7 ~$ X- g
}; y# F! G2 z" C
. E1 @7 g& @. z7 e! O Cell = new stCell*[Width];) K. q& D# g) y% |- x
Role = new stRole*[Height];
& k; b% ~% X4 s. B' ~- e for (j = 0 ; j < Width ; j++); A3 ]* | D' v- Z/ @
{
5 ?9 _3 J3 y! ~& @" C- J9 l5 t2 K Cell[j] = new stCell[Height];) O1 C' I3 I6 ]: c0 P- c( {
Role[j] = new stRole[Height];
+ G$ |+ p" g; T4 n7 G } 4 U, W; m4 b7 }9 g4 v# v- J
2 O& ^) p3 d! u, G, u" d
fseek ( fp_map, 28, SEEK_SET);5 l" g! K2 {7 D5 B
! L! e+ S5 A/ e+ A
for (int y1 = 0; y1 < TH ; y1++)/ C+ x7 H5 R6 M5 Y% y+ O1 X; b
{
# }/ ?" d! z( V( x for (int x1 = 0; x1 < TW ; x1++)
' ~# n* N/ @, K9 ]- t2 W8 i {- Q4 f+ |; p z5 J, g% j
fseek ( fp_map, 20, SEEK_CUR);
$ l& V# e3 o Y. u. H7 A2 X' g for (int y2 = 0; y2 < ShortWidth ; y2++)
; a8 o( F" u. n. L+ j) G {! b. L8 I* X' R. h0 o
for (int x2 = 0; x2 < ShortWidth ; x2++)7 f) N6 |( K3 V( d
{! [- h3 t6 p, R0 @% X
fread ( &Temdata , 2, 1, fp_map);5 a! g8 \4 _$ h" I. L# _
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
/ N+ @, H# H4 v, w; e$ D2 ^" k5 C# e% _/ a
fread ( &Temdata , 1, 1, fp_map);
2 W0 Y6 Z( |- M- c- t9 P+ k5 L Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
8 u. f) K" I4 ^* l+ m% a6 y7 p
% U6 K2 v0 o4 K1 |, _$ a fread ( &Temdata , 2, 1, fp_map);
1 V- w$ A* u/ M/ { Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;3 u7 v( v% E& ?9 ^8 ]0 V1 U* s
( B: F: ~6 c) Q- i# |/ p( |
fread ( &Temdata , 1, 1, fp_map);
6 t9 U% G9 P3 e/ O Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;: n4 \ O* D6 [ Z+ Y2 T
// 6个字节
1 z [. p' @' n
7 D V4 v! l! N- l6 x& M1 o fread ( &Temdata , 1, 1, fp_map);* D* T$ n/ e9 _# d' U; p9 k2 V+ s
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;/ `5 d. @# V" N: J) n7 @9 |* U; Z
0 \$ k& ~6 h( L5 c6 t fread ( &Temdata , 1, 1, fp_map);" C0 ?8 C! w* _0 T. r
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
' b, U. m t. P% J/ b- v" f$ L
: h& S0 H7 `* n- I //fseek ( fp_map,3,SEEK_CUR);
$ b7 f. ^' M0 u' u0 S4 W fread ( &Temdata , 1, 1, fp_map);
$ A/ C2 r) n6 l Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;" w$ ~$ B# c/ `
& L0 K' ^! V- l- e* R8 t8 ~1 @
fread ( &Temdata , 2, 1, fp_map);9 @ y. w, q& U+ b6 U
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
7 ^) D+ d) E4 y; V; j: M, p( {, l6 Z& _/ b
// 1个字节% G) l' K" [% g5 h) Q3 Z0 x
fread ( &Temdata , 1, 1, fp_map);
/ b- D. v7 E. ~* g6 F2 J Cell[x2+x1*40][y2+y1*40].CpType = Temdata;* G+ n8 b3 C1 T2 t3 \7 `7 `# H9 F
//if (ftell(fp_map) > FilZize) return 0;
9 @* \+ k# M4 S# Z3 J9 H }6 ~! i% b. a; ]/ B+ P( G
}
/ ]+ E3 X0 [8 E, N( j }
! W! ^7 A0 p9 w$ H4 ^ }
2 v( f; M0 A1 E& c, X$ e
: g3 Y6 B, y3 C! p& Q1 d( s+ n fclose(fp_map);
4 q# |8 S" d6 N: T6 d0 G$ H9 o7 F+ K/ X/ L7 X3 d
6 {; K& w% y# x) Q- ?; s N, T5 ? }
return 1;, L4 o+ B* {. u6 i
}
' D8 d+ g* Z. b# j% Y; X1 p |