*.map 文件是记载地图信息的文件。$ U `) Y" C: I: D6 D, a. [
1 F* j [+ V' z7 R- U6 {
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
+ s/ o V/ | H/ W: R
% L1 M# I n( l- [, R5 U& ? 第 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 地表一层的序号, s; b }0 y# \0 h" X$ ^9 i
0 w' m3 l( d& R$ ^
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号- }3 q. b% {/ o3 q p
07 在地表二层 12 01 这个大序列下的子序列编号
& E; A1 A$ O- R& Y4 S* o* e( h86 物件层的大序列2 S! q. T% o$ h s* F: B
00 物件层的大序列下物件的子序列编号) C: i: O% J1 d/ t9 N# s( h3 t8 L
03 03 00 目前不详! |0 d4 e3 f9 f7 l7 p1 }
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
9 {3 |& G8 ]- K" O8 [4 t. x
$ ]" o( |3 g% u1 x7 z' {2 A; X% b//************************************************************5 g( [/ U- m" Y0 u& H. ]
// 加载地图基本数据函数;
* ?4 y& }! ~% p* Q& V//************************************************************
3 t( O" N5 c5 g7 A% d6 i6 O$ x! v }& G2 Q
//************************************************************2 X; I/ D' H9 a+ b* b
// 加载地图基本数据函数;
[* Z$ {- j7 s' c//************************************************************+ T5 L& D* f8 B+ A0 `, r# }+ x
" i4 Y2 V0 G/ O3 ]/ J r) I, W# t
int Cmap: oaddata(char *filnam)
4 `! r% }/ q+ p1 F7 _{
& }3 p+ p/ N! g& l) S int Temdata;
) X' }8 j) V, b& a) D" ]1 o7 _
0 Z& U+ Z& h5 z3 \+ {& @9 B if(filnam == "") return 0;
% S, x5 z9 l( N4 P# ~5 f) x Z* d6 f- L0 h: N" B( D
fp_map = fopen(filnam,"rb");
5 E" y+ j4 g6 \$ A& O f, m2 X# l# L- e/ Z# c
if(fp_map == NULL) return 0;
) P ~ }7 I' d k8 I) F
. A( d8 e* X% | fseek ( fp_map, 16, SEEK_SET);
- }, a5 U' W I- |" v( U- ? fread ( &ShortWidth, 4, 1, fp_map);
& r k# C- h6 E i# y- x: w# X8 Y fread ( &Width, 4, 1, fp_map);+ _- U) x5 U7 L* h0 V4 F
fread ( &Height, 4, 1, fp_map);) s; L5 Y& E. e9 l) H
7 i6 ^# J4 {1 f) D8 @' F int TW = Width / ShortWidth;
( [1 |( O5 n/ P5 Z4 m int TH = Height / ShortWidth;
7 ]4 E" G/ H4 h/ z. R2 o. t
$ M! b f, T) U1 r# h' D6 s for (int j = 0 ; j < Width ; j++)
& n7 l$ K8 o6 G0 r {
5 z5 h& A( c* E* X _DELETE_ARRAY(Cell);
8 C k& z' \. G) o0 X B7 x& Q _DELETE_ARRAY(Role);! C6 V/ C7 ?, Z8 W: q- N. r
}8 I% R; t( B- K1 y- X
! D- h; F! q/ A) a: k Cell = new stCell*[Width];
9 Z9 a3 |) J" ]; G& c0 o Role = new stRole*[Height];
4 i1 y) C8 [" c4 M, ` for (j = 0 ; j < Width ; j++): a9 b1 _$ c, l7 J# o" ]
{% V" w7 O. v( @& I
Cell[j] = new stCell[Height];+ V' |0 X2 _9 J0 h$ S
Role[j] = new stRole[Height]; : n' c8 l: j5 l- d1 n, [) p2 p. v
}
* ^" C& I; u" `5 w9 F8 S5 o5 b( |/ F; I0 X6 e2 }7 o5 o" u8 @
fseek ( fp_map, 28, SEEK_SET);
$ S# Y+ K- ?0 _6 y m: @* H9 [2 _. s2 q; }% l+ B) N. \
for (int y1 = 0; y1 < TH ; y1++)
' O0 P$ A$ y% C( V' X: k {
( N" t" r( h, O2 o for (int x1 = 0; x1 < TW ; x1++)
$ @8 N% B s! H& G; t {3 k& }! _* D8 ^- G1 j
fseek ( fp_map, 20, SEEK_CUR);& {0 y ?! R' a h
for (int y2 = 0; y2 < ShortWidth ; y2++), ~, g5 J2 X! g6 U% m
{
2 F- ~. z! b& K3 \( x for (int x2 = 0; x2 < ShortWidth ; x2++)% S( O3 R, [3 ^" U0 Z" W
{( A1 r) E( s) U; `7 Y& S% |8 ?. o
fread ( &Temdata , 2, 1, fp_map);, r9 R P1 j: W% Y4 h
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
! T2 g; E+ ]: Q
4 I& }8 j5 {0 n8 T fread ( &Temdata , 1, 1, fp_map);* D/ s+ `4 e% W5 l- i& M, l
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;( m8 I. g- o0 V: g" B* ]
) U% B5 e8 {7 W) Z, o1 V' y fread ( &Temdata , 2, 1, fp_map);
0 P2 n; v1 A# O+ I" U, y2 L9 B/ G- L Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
, X: b% Q: K9 h! P9 e9 y- r5 h/ j) I! G
fread ( &Temdata , 1, 1, fp_map);
* v# C% Z3 z) G6 O' e Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
5 M) s1 R: J/ N // 6个字节7 o3 O" B# c% c3 i) s
: Y0 s& Z2 a# }
fread ( &Temdata , 1, 1, fp_map);# Y% T- ?7 B; J! ]! `, a
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;3 q% p# T0 t% o: q3 P
8 D7 z5 e1 W% F. J7 @* w
fread ( &Temdata , 1, 1, fp_map);$ O3 j4 U( B4 D$ r9 M; S2 m
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;7 F7 x5 h- p7 B. I: S
- {% @, W5 N% G( N$ d. K- A O //fseek ( fp_map,3,SEEK_CUR);% j# p' B* J: J3 t
fread ( &Temdata , 1, 1, fp_map);. B U3 l9 v& t. a% r5 g) B2 V2 G
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;5 o3 c- j) j1 X; a8 U" v* A
$ p- Z7 d. s0 i( b# U) M; U5 ^. e fread ( &Temdata , 2, 1, fp_map);% R# q8 L) u8 K4 U
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;! |$ @0 {9 K. } f9 K0 M* y
( [2 |* H$ P# h. F+ v1 r1 [# L
// 1个字节
/ \. F( J% }0 a6 P. C7 e fread ( &Temdata , 1, 1, fp_map);5 K: o/ i( k" x) y
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
& U. R. H+ u2 H) ^5 r. X; O( H //if (ftell(fp_map) > FilZize) return 0;! }6 p# f, g' X
}# y8 D4 D7 C5 U9 T% i6 B4 @
}
) O3 S( y, {9 U( @5 e }1 U% \; \2 ]3 w# L. R7 o
}
" r) N: A' U- [& ]: V- q- I. S: \+ `* r$ h& G
fclose(fp_map);
* Z1 M. \) n3 y' J6 n2 |8 @
% h6 i, e1 W- j- f, R g0 b: z! M. L2 ~6 S
return 1;; v( ?6 U9 o/ b9 Q5 j
}
A% K7 r& D7 K% f9 g' R1 e |