*.map 文件是记载地图信息的文件。1 S- w8 N- t5 @
+ U2 X0 T6 e2 }* G 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。' B. A# G) i C; w/ `9 o9 _
8 G. ?( ~7 i* q8 g
第 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 地表一层的序号6 i& ]# [. ]7 n7 E, c' b
, [, }7 Q4 H2 U' _4 Z. o03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号0 C5 \/ o' ]) O9 m
07 在地表二层 12 01 这个大序列下的子序列编号
% i0 q* w$ t E# ]0 t86 物件层的大序列
: q( I6 G; q' U* c0 B/ {. z) V00 物件层的大序列下物件的子序列编号/ @ H# W$ L- n5 c5 e! q2 U9 Y" f, e: {
03 03 00 目前不详
. Q [" f1 l+ X/ ]01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
9 c% x3 l) F& K" y0 }9 R3 j5 R0 C
//************************************************************* P; V' M# M( L: b
// 加载地图基本数据函数;" n" ^% }! T# k7 k. {
//************************************************************
. V* R& G* y( l+ E5 E3 J# f; b9 Z3 n" O$ |; {
//************************************************************7 q! N6 v+ H) S- }) k' S4 S) M4 K/ E2 {
// 加载地图基本数据函数;
1 Q. X" R5 w2 f/ b; g//************************************************************) w. @1 I' Z$ L- D
: p3 ^7 [; y4 ?2 ~8 R: \+ r
int Cmap: oaddata(char *filnam)
) ]2 W' Q% m0 u# ]: ^6 h{
/ B! ~& y0 M9 N% w( @; e, m" i, M int Temdata;9 H8 E6 S5 G5 Y& r3 c
1 \# F+ `- h* ` if(filnam == "") return 0;" \' y3 a; ^7 @8 c/ P3 o- g
) X/ j& ]7 x9 j2 W fp_map = fopen(filnam,"rb");
+ t1 n& C, E* b: U$ r* K: E: T+ H0 W& O8 C. M( `4 g
if(fp_map == NULL) return 0;0 u. j' Z) J+ b* \8 X7 @
& ~. F* d1 B0 a6 K fseek ( fp_map, 16, SEEK_SET);
1 i0 y( N' J' g$ { fread ( &ShortWidth, 4, 1, fp_map);+ p- b/ ~! S/ a: e
fread ( &Width, 4, 1, fp_map);
% x; _$ T& K! {2 U2 x V5 o fread ( &Height, 4, 1, fp_map);
, G- I" Z, `9 u" w9 L' k9 h2 y2 _1 @+ _7 M! N; ~; t# c2 m
int TW = Width / ShortWidth;
) i+ U1 l; J3 ]% y8 N8 e0 n0 L int TH = Height / ShortWidth;* D4 Q5 K, @6 S9 {3 q5 q# z8 I5 i9 R, R
3 u8 x* s8 z! r: K+ f for (int j = 0 ; j < Width ; j++)
: V1 _6 {2 G( V2 @ {
# J9 e3 N3 m0 i+ p# n _DELETE_ARRAY(Cell);9 Y6 i( a& ?( `! }' _% I; m
_DELETE_ARRAY(Role);4 r. O. a. Q4 k: `4 |$ ^3 F, q
}$ X2 p/ N, I* k4 d8 g m/ {
* \9 o2 F7 n! y# u
Cell = new stCell*[Width];
; O; w7 R* t W1 T Role = new stRole*[Height];2 M% T: V4 M& V" ? @
for (j = 0 ; j < Width ; j++)
- }8 Q- [; Y" l7 m7 c {4 L! Z3 J- H- b- d7 \+ j8 G! ^) U
Cell[j] = new stCell[Height];
! }8 b9 z5 \7 l" A# o- Q+ D. ]- E Role[j] = new stRole[Height];
# U- ]( z% s+ }' X }
( g/ p2 u6 R; ~) l& }- f4 C: S; ]
/ _2 D+ H Y1 h fseek ( fp_map, 28, SEEK_SET);% i' b7 c$ ]; d3 }* F2 ~ V3 z
6 v& ^- C% |4 V( |
for (int y1 = 0; y1 < TH ; y1++)# t4 k) Y" q9 Z5 ~
{" h3 C4 M. O: {3 }: v
for (int x1 = 0; x1 < TW ; x1++)0 D9 r5 V' \1 v2 E$ \1 o
{
O) v" Z0 ^: y) k fseek ( fp_map, 20, SEEK_CUR);; P' J4 k m" j7 k! `6 `
for (int y2 = 0; y2 < ShortWidth ; y2++)6 F$ n2 f0 G/ Z6 b
{, v& b2 p1 H/ `( F6 f$ [. O5 {; M
for (int x2 = 0; x2 < ShortWidth ; x2++)
; K7 [+ H( O4 E- O" | {
" s; X/ K# W$ H9 V% X7 T3 G3 e# ` fread ( &Temdata , 2, 1, fp_map);
6 k7 H1 z6 P" z) R$ O/ Z9 M$ D& [ Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;' o6 ?; h% m. k8 Q5 e& v
+ s; b& l7 \2 A% L( y fread ( &Temdata , 1, 1, fp_map);
7 e8 x6 y. R5 ]: o0 \" F. T Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
9 R6 E A/ n; [4 o2 K0 {; W& N- K5 ` h# T, q' ?. \8 r% Y/ u0 C
fread ( &Temdata , 2, 1, fp_map);+ S/ Y. y- `! b, [. @
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;+ j( N. S4 c7 h# `" v
- m1 S% d1 O, l% G fread ( &Temdata , 1, 1, fp_map);
1 O0 _/ x+ X4 V Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
/ G5 A4 Y7 |0 [1 N- M/ P // 6个字节3 V, e$ n. Q2 F; d
8 |# E. ]. o: P: D* j fread ( &Temdata , 1, 1, fp_map);/ M5 G Z5 x [' e3 f
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;) E- b9 T1 _& J) h
1 V! K( P4 p/ X' R" \! a
fread ( &Temdata , 1, 1, fp_map);9 i( N1 Y+ G# G, w
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
1 d% Q' ]! o& j- C8 k- `" A9 {) c
//fseek ( fp_map,3,SEEK_CUR);
% `( N" v. g) ~6 U fread ( &Temdata , 1, 1, fp_map);& X! Q9 A4 m& Y# A! J; {
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;* q7 |$ b% r* [8 Q/ z$ [
" ]- q1 Z$ l! Q
fread ( &Temdata , 2, 1, fp_map);3 p; Z+ {, g4 w/ N! Z3 P @. u4 b& V
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
: }- L6 g3 ^* _1 E- H e& Q6 W W4 i `9 ]5 C" I" M% {3 t
// 1个字节
a/ j" y3 o+ N, J5 B fread ( &Temdata , 1, 1, fp_map);6 r/ l" \7 u& \1 e( ?0 h
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
2 T: A# L* J& [5 Y //if (ftell(fp_map) > FilZize) return 0;9 u6 N/ Y" c4 {/ D; `1 x
}! Y- f+ e$ ~4 [1 _! Q) F
}* W9 X4 ~( x! o
}
* |+ T) h" Q$ k t' p3 N+ h }0 l/ b; B: z( Y/ e
7 [' W- ~0 l* F0 X5 b: d, B X
fclose(fp_map);
9 @& [1 u5 ]2 S8 ?* X7 H/ q" U! a. D* O
: B5 \ \+ _ h* f8 d5 q, } Z: f return 1;
+ G: {0 J/ X+ k+ z: [, h/ Z}
, K6 o' s- o0 g" g) G# y |