*.map 文件是记载地图信息的文件。, `" m8 h6 G" |8 O
- ? g* n' e: Q3 g( _ 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。) i J w2 q( L5 N2 R3 G
, F$ l; V4 |4 m
第 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 地表一层的序号; \2 u" C$ F; r* h
, a% j2 n# J, u0 N( e/ q; [0 K$ z
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
M+ g; c8 Z7 v4 l' R v07 在地表二层 12 01 这个大序列下的子序列编号& @5 O8 }* n! w" f8 W3 B
86 物件层的大序列' {/ | m- A4 T# ^
00 物件层的大序列下物件的子序列编号4 _+ S y# d1 ~' P, m: h) x
03 03 00 目前不详
( V% O: _7 o7 E+ C/ A: b. k01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。/ ~$ p% p+ Y" }' Z' d2 ~4 o
9 q% N6 M* p, Q! a* @+ ^5 [0 k
//************************************************************
5 p$ [) h5 s, Y. T9 N1 r. B// 加载地图基本数据函数;% x/ L* z8 G8 L' y6 J
//************************************************************
) \# Y/ j" z8 `1 Y: Q" F+ R; n0 g
//************************************************************8 U8 G# _% v6 b! G" C
// 加载地图基本数据函数;( l0 {: g+ g* H' o( I
//************************************************************
8 |" U2 ~1 L7 s$ X! X g) L) |! y8 `
int Cmap: oaddata(char *filnam)
# w, ?- J+ l( {9 D5 [{
: F% t$ {( ?: s% N l% h: }4 \ int Temdata;9 Y) G$ s) l" F
( O% ~6 n( ~6 N' f if(filnam == "") return 0;9 n" G/ i7 d. n- y6 s o1 \) B
2 R8 n1 r9 J5 |" O d5 k! Z5 O fp_map = fopen(filnam,"rb");4 D1 ]1 {7 Q! G/ c8 g
* u7 A) _9 _* t- x$ \ if(fp_map == NULL) return 0;1 j8 T6 l7 [$ q, t0 ~. x
$ f* K2 {# W7 C& w fseek ( fp_map, 16, SEEK_SET);2 J' C- ]6 |2 q; {2 `/ h6 J. e# d
fread ( &ShortWidth, 4, 1, fp_map);
g/ s8 i: x T7 Q/ G* f/ M7 d) | fread ( &Width, 4, 1, fp_map);- \2 }" \9 ^$ i* t
fread ( &Height, 4, 1, fp_map);1 X" T2 o5 A1 ~2 k" k0 T4 a
* k# h/ [/ N' @& _: U. y" n int TW = Width / ShortWidth;
% T# \5 v3 ? s; H+ q2 t int TH = Height / ShortWidth;
7 a( ^% F) f4 R4 b. d6 |/ G. W+ w& Q4 R
for (int j = 0 ; j < Width ; j++)
) Z) d3 _ N/ |0 W0 _' C1 ] {4 L3 ]" W3 O6 ^9 [; w# u: i
_DELETE_ARRAY(Cell);
* q6 S- d/ J) B+ o _DELETE_ARRAY(Role);& g0 S5 I8 J5 e; h# }7 ]. U
}
) _/ T/ p4 H$ Y8 \; U" [6 ]- @4 ~4 Y# X7 c( T" K
Cell = new stCell*[Width];9 ^ T. K3 {+ E5 I# g( @
Role = new stRole*[Height];; O4 i: O9 E' \9 P; F7 }
for (j = 0 ; j < Width ; j++)$ O, x; @. v; u1 F; {; G# N0 f* [
{
2 f! d/ s* t6 K; `, p4 y0 J: \ Cell[j] = new stCell[Height];6 ~6 D+ [1 P5 Q: ^9 f
Role[j] = new stRole[Height];
8 U4 D- K r/ W6 ^. @ }
) k" f- s- _# ~% ^
. e: X' M1 Y# U* V+ U fseek ( fp_map, 28, SEEK_SET);1 [ F: y# c" _6 Q. w3 o
7 K4 t) j5 ?. O2 m' R for (int y1 = 0; y1 < TH ; y1++)
|( B W. B' m: D2 [( ? {
, ]$ b# D" @6 S: W$ P1 K, p- c for (int x1 = 0; x1 < TW ; x1++)
0 L: ]/ S- h1 R( _: d8 r {- `( D# t. F$ I( B" w. a9 _% d
fseek ( fp_map, 20, SEEK_CUR);% B# U0 f- e' b3 K/ |- h
for (int y2 = 0; y2 < ShortWidth ; y2++)7 E0 f9 R1 y) N7 }2 R; R* v4 p5 X
{
& K0 B) s7 ]: t& X% M5 z for (int x2 = 0; x2 < ShortWidth ; x2++); W. T6 F6 |4 G: A
{
: z) D0 s3 b% o6 l fread ( &Temdata , 2, 1, fp_map); @- A$ |* @( h5 |
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
, \. c2 j- Q7 d) h* c' P+ h9 i U! ?' D9 F
fread ( &Temdata , 1, 1, fp_map);
: U, W( L, ` D Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
- z4 h4 W; k" v1 ?; p3 b
8 j8 h& V( o( k! v% E! _+ q% U* } fread ( &Temdata , 2, 1, fp_map);8 ?, I; W7 b1 O4 j) m
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;- r2 A8 n1 l8 m9 Z5 {5 P
$ ~. w, I3 ] Y! p, z
fread ( &Temdata , 1, 1, fp_map);
- `( u3 ^. C C% B) L) T Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;, a: q# s- q' Y
// 6个字节
" v( r) o# h0 t! h0 G8 C8 O
' a6 X9 T+ o1 _4 M: v$ c fread ( &Temdata , 1, 1, fp_map);$ x/ q( b! Z& R1 k% u, p7 x4 f) v2 q
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
, K( d5 E' Y# X& _' x. F 9 z% H+ R Y: y( c" V2 A3 S
fread ( &Temdata , 1, 1, fp_map);
# _) V7 B+ e9 D. p/ ^+ I Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
* Y# r$ J4 s6 z5 ?. p; O2 T7 w8 P; \& }0 b! n
//fseek ( fp_map,3,SEEK_CUR);
6 @ R5 y3 x6 S: ~4 \* v! r; ~ fread ( &Temdata , 1, 1, fp_map);: b; y0 d5 x* G
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
" O' I* z2 S" R0 n/ @ & b# v- c5 e1 h9 g
fread ( &Temdata , 2, 1, fp_map);
4 C) U2 X5 r5 S6 R4 W* K Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;% @! ^8 D/ J3 b" I% \' [4 _
; B G& ^5 r; R9 A // 1个字节' J: _9 X) V2 s9 w6 ~8 K
fread ( &Temdata , 1, 1, fp_map);
t' V8 {1 f$ Z' j- n6 y E Cell[x2+x1*40][y2+y1*40].CpType = Temdata;5 B: g( Z4 k+ Q) k( C# j
//if (ftell(fp_map) > FilZize) return 0;
( |) X% i7 p. t, ^6 i0 o }$ |' { N) E# K0 c4 N* i* I, ^( E" Y
}
5 f2 R! r8 I- V: Z7 `# U8 z }
( `/ d6 P- l4 T6 ~' ~4 O, C. j* t }
/ ]3 m$ Q: N5 O. G; R9 }% @0 N ]% Q1 f! z5 v
fclose(fp_map);
- F2 \5 Y5 {3 Y8 o- J2 ?6 R: {, P" v/ C, d5 s& c% H
4 j3 o, H7 i' y! D$ q# P$ d8 t: I
return 1;& W8 N) d* k+ n3 g5 i7 A7 _
} + O4 v% b; |9 _' r
|