*.map 文件是记载地图信息的文件。 I( D7 S6 e, c5 B3 C& n. }
2 v9 G1 Q, a" {+ E 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
' O, F* P3 J. H# }# X s* O) I1 ^- E- E8 I( A
第 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 地表一层的序号
1 ~* s) }. v! ~. ~: _. J4 t7 V0 c: c0 |5 j
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
! C) A6 {7 P0 J% `1 A- r07 在地表二层 12 01 这个大序列下的子序列编号
6 M: s' j! O0 O' G3 I1 b3 F86 物件层的大序列: `+ D! Z3 B) V) [' G% l% f
00 物件层的大序列下物件的子序列编号* k' I% s$ v6 J
03 03 00 目前不详8 i7 k+ p$ s# ^9 L
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
4 e' |5 L- S7 ^" t& |: b$ D3 t- J4 c' i+ a) h
//************************************************************# f, p" C5 ~4 W% X
// 加载地图基本数据函数;
, ?4 {: I; k/ c. D9 P7 ~) i( F//************************************************************. s+ Q9 m$ X' r" f$ }" D
; Y8 j" ^( f9 m4 ?//************************************************************$ Z5 H# a/ S* k( a- N4 z
// 加载地图基本数据函数;
1 b; F7 Z2 F1 C. w8 L, q" K//************************************************************4 E, g5 ]. g w" Y7 i! s
! }* Z% ?! ~2 N7 }' `3 o+ ?int Cmap: oaddata(char *filnam)! o0 E8 l/ [& Y( H7 Q5 |
{
9 o: ?) \, ?+ @ int Temdata;- s. |6 E4 M5 j5 O
8 R `# ^% E8 y
if(filnam == "") return 0;
{+ L4 z) q4 o2 u4 u
9 }; A( e/ [& G1 f fp_map = fopen(filnam,"rb");$ K" G, ]! Z1 A1 k {
( x* y7 F8 G! Z$ W2 }2 C5 V
if(fp_map == NULL) return 0;
8 P* ^, }0 @# A0 R8 V4 k% L% u$ v
2 W+ C3 }$ q: F) @3 S fseek ( fp_map, 16, SEEK_SET);
% g+ I" f0 s; K! w1 H: p fread ( &ShortWidth, 4, 1, fp_map);$ }/ N$ Q8 f# p. Z. m
fread ( &Width, 4, 1, fp_map);1 j8 Z, B! B+ i/ f' {# K4 ]! ?4 W" i
fread ( &Height, 4, 1, fp_map);3 q1 V+ ]7 p Q C) @1 f L! [
. F& o1 k9 D/ a$ D int TW = Width / ShortWidth;
+ E" o$ i6 ]9 c# C int TH = Height / ShortWidth;
7 @' T2 v0 z. z* \# ?/ H6 q
5 }6 B0 K: s) D for (int j = 0 ; j < Width ; j++)
& H0 e7 T& T9 O2 s$ J" } {0 e& t; d3 z/ }3 z
_DELETE_ARRAY(Cell);1 U! Q3 |/ Z6 h- K: E( U7 n2 ] i
_DELETE_ARRAY(Role);# e8 w9 W' R, t( s% u
}3 u; X! H3 f, c0 A6 Z2 n, j% N% C
! e, x4 f3 M9 j K# }8 G Cell = new stCell*[Width];# e3 h) z* R; V' Q; s8 h" @3 r
Role = new stRole*[Height];; a) o( r$ F* V
for (j = 0 ; j < Width ; j++)/ o# S& [4 s! w, l+ d C# {
{
2 p" c6 D7 A. |2 X" A Cell[j] = new stCell[Height];
: ^9 S3 ~& d4 w8 r8 I/ F Role[j] = new stRole[Height]; 5 u1 x- c O( z0 c
}
4 q) l, [8 o5 Y% `0 | x, l1 Q( K/ o* H- `) _2 Y0 M5 J* |
fseek ( fp_map, 28, SEEK_SET);8 C' T( \1 l5 Y& ~ y) E
+ F+ Y. E- C- u1 X
for (int y1 = 0; y1 < TH ; y1++)
; p7 [( }/ \- n" N9 F" ~ {
f6 Y/ M j7 _# h( L& H! L/ K for (int x1 = 0; x1 < TW ; x1++)3 L. q/ s0 p- p, j% A: D; G' z. B
{) F3 y" e, _! D
fseek ( fp_map, 20, SEEK_CUR);4 L1 S3 ?+ M% [3 U
for (int y2 = 0; y2 < ShortWidth ; y2++)
4 W0 A/ F5 E7 O/ E {
- Z4 B4 n$ o S8 ]$ v for (int x2 = 0; x2 < ShortWidth ; x2++)
5 c( K* g" O# P9 @ e: \8 m# @8 E {0 n. p% o7 e0 w( Z$ b% |
fread ( &Temdata , 2, 1, fp_map);
7 r! p8 c0 t0 U: f( U Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;) R8 V6 G9 x8 g( [" T9 ^3 r
5 s+ R( `& J4 F! N& u7 M& _, j
fread ( &Temdata , 1, 1, fp_map);0 H' i% j, p" Z3 J# t, Z) g" q
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;0 d9 w6 I+ e, f# W( a& |
& O5 v) h9 k9 J: t
fread ( &Temdata , 2, 1, fp_map);% ~* j4 Y2 I* U4 ?
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;3 W: k/ }/ B( Z/ j& D; ^
9 E: ^. Z4 H- U w/ s5 g, x. t& x* g3 I
fread ( &Temdata , 1, 1, fp_map);, X3 o3 o b# V9 l0 Q6 h: r# D/ s: B
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;. L: |( A7 ?# w9 D$ `; l
// 6个字节
8 s1 l+ L! k9 C
$ j2 Z- B4 F6 z- x fread ( &Temdata , 1, 1, fp_map);
) U8 b8 X( u) v Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
0 a1 D O' {% o2 e! b 2 q) k5 J L) s7 t9 m! V5 ~
fread ( &Temdata , 1, 1, fp_map);5 @; Z: g6 Q" j4 f
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;! I) { R& K! Y1 k( ]
4 x9 x7 J+ H8 i( ]* a" t
//fseek ( fp_map,3,SEEK_CUR);- g2 ~- H5 j4 r# \/ |( T
fread ( &Temdata , 1, 1, fp_map);- b$ n+ z' s2 a" Y. U" H
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;" o* K0 O' h1 @; H% w* P$ j
Y" D) U% K2 X6 Z9 ` k2 D5 l/ I' v) f4 j
fread ( &Temdata , 2, 1, fp_map);& A) _! a y/ U. q% C
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
( ^" C9 n# F5 L [. w4 L
9 [" c# ^2 H! B: e( v" x // 1个字节( _& l2 j" H+ R) y% b5 y
fread ( &Temdata , 1, 1, fp_map);$ m. P5 j: z2 d# }
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
) i! t- u/ d' l5 S0 H //if (ftell(fp_map) > FilZize) return 0;
) s3 z9 A( ]. ]! O }6 m1 `' w$ u' A
}
0 ]/ z$ C) |' @, i# M2 \ }
# V% v) f; K) g; F }, t, a1 M$ T [" I9 d3 k( |1 I
; `% q: g: A. P1 B9 n: e7 \ fclose(fp_map);7 ]0 ?- m3 M1 @4 J0 w
0 c- j: M5 O; c
1 ~- }8 L- u6 d1 ` return 1;7 a, h+ h( y( |" X8 g: E
}
) u* s! P& e: u, a) Y |