*.map 文件是记载地图信息的文件。
3 W/ t- T' Q8 `
% U+ B. V8 a* j1 }/ y, ? 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。$ y8 J/ _9 o1 }2 _5 |& D
- ^: r' ^/ V5 [) ^9 @ 第 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 地表一层的序号% U2 r6 c7 t! n a. y' X2 j
2 b/ N3 u6 O3 F9 i3 o2 ~; i
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号+ l0 y3 q: Y* v+ |& I. e5 r; a9 ]
07 在地表二层 12 01 这个大序列下的子序列编号; l( D x7 H3 R; p
86 物件层的大序列# f/ c9 p2 ^$ K7 o$ f
00 物件层的大序列下物件的子序列编号
- y- k0 v( u7 q; M03 03 00 目前不详/ w+ ^9 X: w. S. Y' W
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。. p; c8 |- x% {% E/ F
4 W4 [# l" c8 Y7 [2 G//************************************************************
2 s$ O1 |- `! t5 @ K; U8 I( o// 加载地图基本数据函数;
- j) V: C. o' i' p- U+ W//************************************************************9 j" b: M! n" M* {
. t! b/ ~. W+ ?0 B) m/ I5 v//************************************************************
; C: m `3 A( k" t' c. B- ?# R// 加载地图基本数据函数;8 H; A! w1 X/ ?0 K) ~
//************************************************************ @$ s* `" i) f. O
! p+ I8 l6 u4 |& B: w
int Cmap: oaddata(char *filnam)
6 G, Z3 S5 e$ A/ Y. `4 G8 K{2 t4 t$ i6 Y' ~% }0 D# Y
int Temdata;
. v9 @3 [* Y4 k4 G1 S- ?6 ~" v4 l" d/ ~! m
if(filnam == "") return 0;* r$ s1 a; b0 O, c+ Q% N
* e9 [3 h8 W: D s7 p2 Z
fp_map = fopen(filnam,"rb");
, V3 P% }" |2 f5 G9 J( g6 h
( k9 l: i) v! X, w } if(fp_map == NULL) return 0;, }! U/ j" A4 U j) a
2 ]* ]7 o t# G. o/ ]) {* F
fseek ( fp_map, 16, SEEK_SET);/ ?1 b+ _$ l: q: h( F
fread ( &ShortWidth, 4, 1, fp_map);
1 @9 _. M7 f- D# E% X fread ( &Width, 4, 1, fp_map);
& R- J# g( i5 G0 v fread ( &Height, 4, 1, fp_map);2 {8 N% t9 U1 d/ P- @$ o2 v
! k: D% M) [* m9 h! {) h0 R% Y \# J int TW = Width / ShortWidth;
( _( x- L; U8 p% \ int TH = Height / ShortWidth;; G! b: u: U% U+ d
5 L: L+ v7 R6 j0 F) R# }
for (int j = 0 ; j < Width ; j++)
) t+ P/ n0 o0 h/ h' ~ {% S( S) T( T7 G% {" r$ T
_DELETE_ARRAY(Cell);$ M4 D" m7 d9 x/ J! ?3 R4 O$ {/ K
_DELETE_ARRAY(Role);
: u, s) u; r5 o$ k1 a9 A( t }, i* s% [; L& O% T
: ?3 _' s4 D, p Cell = new stCell*[Width];
" ?8 O4 ]; x8 n Role = new stRole*[Height];
$ G& D+ Y, F8 D U4 G, `0 @5 T for (j = 0 ; j < Width ; j++)
9 k: P, E1 I% z! ` {4 a4 r9 [. N9 d' e- }, {
Cell[j] = new stCell[Height];+ @0 _/ i0 W- a! Y0 m
Role[j] = new stRole[Height]; % O4 T. n- r( y# S
}
7 s, g( m a% f) I$ ?
_6 Y) H$ z4 S! _3 A fseek ( fp_map, 28, SEEK_SET);2 U/ k( O8 j; s8 X: L) F1 c* E
( m/ N1 M- l: Z$ ]+ a2 _ for (int y1 = 0; y1 < TH ; y1++)9 Y0 k7 b3 f8 Y3 {/ S- A
{
2 z1 ~* E8 h; q7 J for (int x1 = 0; x1 < TW ; x1++)
[ u- f5 u1 D. O, H {) l H X: O4 P T3 a/ L1 p$ n
fseek ( fp_map, 20, SEEK_CUR);" n% f6 |+ G9 `; Y
for (int y2 = 0; y2 < ShortWidth ; y2++)
! Z& W y' K, ~/ k {
5 E ?: K: E. } for (int x2 = 0; x2 < ShortWidth ; x2++)
) Q% N0 q$ G& | {* V$ G8 z7 f* s: E2 u" q
fread ( &Temdata , 2, 1, fp_map);
q6 L0 g3 E6 r" G0 D! ^0 k Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;! B0 N+ x6 v+ k) M+ o
. ?5 l. x/ m1 G5 v
fread ( &Temdata , 1, 1, fp_map);1 N' c' r. u O. p
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;+ ^& ?2 \- q: p3 E4 ~* ]% e( L
; J- p+ t0 |% J& E$ X. s" b
fread ( &Temdata , 2, 1, fp_map);# l! v+ f; p8 d2 U9 i8 [: n. R7 { t
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;, ^7 I2 l8 y4 h3 z) y
# I9 G, v7 s8 O( a. i% i3 G9 C fread ( &Temdata , 1, 1, fp_map);
- w: y, Y0 a/ W1 V Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
9 e( ~; P7 g# ^% V* u // 6个字节
( S O2 d$ C" C! D+ }! C6 x9 P- }" {; |0 e6 \' r3 C7 S
fread ( &Temdata , 1, 1, fp_map);
* M8 X R% Q+ }; b5 i+ L Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;& _7 Y. M/ |- a) I
! G; I1 J2 `1 s1 _: `6 K0 D# z# I3 t0 l
fread ( &Temdata , 1, 1, fp_map);
6 w( W% a+ D' ?: q3 O# i- D Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
2 S& z T% K- D9 W: [
; A% j7 C" E, ~3 c //fseek ( fp_map,3,SEEK_CUR);
; m. H$ _ D1 u! ^# d fread ( &Temdata , 1, 1, fp_map);+ t, t. h- N$ j$ _
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;& o& [/ g- ]; _, M( ], N$ k5 S
9 Y! R7 P$ ?' X' x fread ( &Temdata , 2, 1, fp_map);: I) v2 I h7 v
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
8 l% ~/ Z& y, G$ W! z+ J: m6 a8 G. {3 f! {- q3 _
// 1个字节
# q( e# e" ?7 k! s6 b fread ( &Temdata , 1, 1, fp_map);
( Q) t3 L# I# w2 w Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
9 h* q3 D7 e& d //if (ftell(fp_map) > FilZize) return 0;9 f) k6 X- B$ U% h: n, L
}
- ]. i( f5 B. ^ }
: b1 c( _9 Q( P5 T& w; m8 f }
$ Y" k) b3 O# ~# p" h2 T }
% B$ x# y) ~: }0 N3 g9 s. n L5 v% ~: M4 ~
fclose(fp_map);
5 W* I4 N. ^- K7 y- D0 r8 c. R# J8 U/ C n
4 u: E3 W1 e1 [- d return 1;5 j9 C! z; G6 \+ Q2 r
} 9 D8 j* k. K' e8 d: q
|