*.map 文件是记载地图信息的文件。
0 r) v/ D9 M* a
) f6 n7 v3 s, s 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。5 y; d3 x+ N0 Q/ Q2 N
. |4 c }6 x* m: f. w& i7 t* K- w 第 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 地表一层的序号
5 p# V& q) q- e
& P" H! T1 I D6 r% D2 V }8 |5 }03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号# @( g: j- ]8 Z+ a0 p9 u
07 在地表二层 12 01 这个大序列下的子序列编号
1 |# V. M N" _5 ]7 |3 m86 物件层的大序列- u0 e; P9 D8 b( L$ t/ i6 A
00 物件层的大序列下物件的子序列编号
% O" p7 p8 m2 g03 03 00 目前不详$ G- b, b/ [6 b1 g4 u
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
% A) ? r3 v0 D `5 t5 w5 W( p; l9 h, |0 X) l9 n+ v
//************************************************************: L6 A0 n3 Y, i# e n7 l8 O |
// 加载地图基本数据函数;0 A0 p3 f% q- L' ] ]2 K
//************************************************************% c4 l7 @$ G# G( c' w+ v: @/ _ s
8 o W2 l6 }7 c: x; Z9 G9 X//************************************************************
0 e6 k) b m( r2 c' }( e// 加载地图基本数据函数;- E: P* @; a& p. o: n
//************************************************************
& Z$ Y7 O3 a* R: I {: F+ K- c& g9 P) X/ L
int Cmap: oaddata(char *filnam)
' v1 B/ s5 w" x: P) i8 U2 S{ U# z: u2 N& q( m- c, B( _, j8 q
int Temdata;
) O! h* H; h" R1 e) {) O
, `" a% D( z P- ^) M+ w if(filnam == "") return 0;5 F% k7 \6 _) W. ?& P$ {% a* q7 ~
6 B6 V: ?1 h, d m% Q7 _ fp_map = fopen(filnam,"rb");/ z7 r$ `8 G" F2 a
0 u3 i, q9 f" O! N2 y: V
if(fp_map == NULL) return 0;" P; [. N& s0 @2 n* R$ L
5 h- w% q$ M0 o+ ~( ], P. V
fseek ( fp_map, 16, SEEK_SET);! y7 y" j+ P- E
fread ( &ShortWidth, 4, 1, fp_map);
' b9 q- j7 g! I1 f# W1 I! B0 n2 V1 | fread ( &Width, 4, 1, fp_map);. i( _$ }4 w+ e; y4 X
fread ( &Height, 4, 1, fp_map);8 I. S2 t/ v$ i" M: k! Q5 `' K
" |6 t, o* I c7 r' R# J int TW = Width / ShortWidth;
0 |8 v5 l6 N0 }) }4 A, Q- c int TH = Height / ShortWidth;9 x' d% G" Z: d
: o/ c& W5 B& p: D for (int j = 0 ; j < Width ; j++)
" {4 Q+ I0 O- ?" g5 A {
7 j) W0 C# I5 ? _DELETE_ARRAY(Cell);1 T. Q. g8 ^( C
_DELETE_ARRAY(Role);8 c. g/ h! d6 w
}
% S( g) Z r x% A/ {2 x
+ y: f% \, c" w1 F( }6 S Cell = new stCell*[Width];
8 t* M) i) J& D* I' y1 I Role = new stRole*[Height];
: ^ R* \7 L5 }: U' x for (j = 0 ; j < Width ; j++)
8 S" P* Z" f; O( ~9 x. O {
& {7 ^1 b9 p1 m% Q/ d* _6 V* B) D% { Cell[j] = new stCell[Height];
9 {4 U5 q6 o( D& G: h! N! Y Role[j] = new stRole[Height]; $ d( p) A: }; b/ k( Z
} ( y9 n' a4 o# d% ^- Q1 I4 b
7 S+ b* V2 C, F3 m- h t1 i# I
fseek ( fp_map, 28, SEEK_SET);2 ^% _9 s6 `% s" A ~& @6 x" g
. `0 N7 A, S s' g
for (int y1 = 0; y1 < TH ; y1++)$ F5 E) ?$ D0 ^, d* c
{
, ^" i G- f2 A2 Y for (int x1 = 0; x1 < TW ; x1++)
8 l1 V! k% C- ]3 @ D, _ {
C8 K7 L5 m" G4 Q fseek ( fp_map, 20, SEEK_CUR);5 [* D- G+ e8 {! f6 U/ r5 E; l- L( y
for (int y2 = 0; y2 < ShortWidth ; y2++)
- v. D9 ~2 g( W. u1 }8 J- `+ ~ {
5 ^3 k& w' c2 y0 l* A for (int x2 = 0; x2 < ShortWidth ; x2++)7 Z; s6 U$ e( N
{
# N/ B! M! O3 h) P- @7 { fread ( &Temdata , 2, 1, fp_map);
5 J& c/ j2 l: I8 l5 a8 I# U3 V Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;! L8 B. O! R" M
7 [; ~. r0 L2 Q. U2 C4 \& U
fread ( &Temdata , 1, 1, fp_map);' {; d, l- r' I# S' ^4 V
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;6 x% i! g/ j8 }% ?( t2 l
+ o2 o/ y4 P3 P- }, {
fread ( &Temdata , 2, 1, fp_map);) @+ r$ R/ r; E3 c8 a2 Z
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
* f. @, S. ^% |0 H6 h/ E0 r1 C. ?2 V% X
fread ( &Temdata , 1, 1, fp_map);
, h6 s7 O& E8 g9 \" K2 m Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
7 t7 _7 h4 O" f- n. z // 6个字节: H! d4 h( L' H: ^' J- @# Q1 G7 a
5 }" y. s, ]; [4 D fread ( &Temdata , 1, 1, fp_map);
' \ \; w5 v9 u, | Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
3 o Z+ A* v& b7 E) q o9 e& @( T5 M6 @
fread ( &Temdata , 1, 1, fp_map);
. R. ]' A" {% l Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;/ b4 ]! Y+ X& u& d/ L, W
1 j; y0 g( p* c, Z2 v8 O$ A
//fseek ( fp_map,3,SEEK_CUR);
* k1 k7 U9 W2 c6 f/ P fread ( &Temdata , 1, 1, fp_map);9 a: e3 c: }+ D8 i! Z- x ~) G
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;- A5 ^* P2 N9 T) i0 ~
" O# ^; M8 S) V1 {
fread ( &Temdata , 2, 1, fp_map); u9 Q( o5 I5 w8 o$ Z
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;/ M! \& J+ n( H: F( P8 [8 o
7 b8 s9 ~& O# B% ^' u
// 1个字节9 L$ H+ V/ L! x2 \1 p; f) G
fread ( &Temdata , 1, 1, fp_map);3 W$ r* C; g2 w4 P& n
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
' k( t- J8 m0 M9 v! B2 Q2 O4 j //if (ftell(fp_map) > FilZize) return 0;
( J! y- c: ^5 z) b+ `3 x+ c5 s }; Y4 n. x0 E9 ?
}( M/ Q3 R E! j5 J. q: x$ k" F \
}- j7 Q# R/ ^+ @3 X: y1 r+ N4 {; H
} V+ k" \# H2 z% ^: ]7 k P6 k* Q! N
9 Y3 r. l& S1 n c1 D0 f5 I fclose(fp_map);
) D& A2 |% X$ w% ~6 c# I- E
" Q7 s# G$ ^! x& |9 F
l1 }4 ^) K# }- y! x" P0 ? return 1;9 ~! j1 F* h; Z8 g
}
, ]6 S, N6 T9 t: g' u. Q |