*.map 文件是记载地图信息的文件。
2 T' M& F- k, o) O, Y/ P C- C* A1 u l* D
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
# ^( @9 N3 A: ]; o! L; ~4 `! I
! W) @& d+ V/ Z5 b# \9 O, H 第 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 B7 g7 _( R$ M) x, v1 F
8 [9 ?6 J1 Y% n+ F7 [- b
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
) s" w8 [' h, o, ^) K07 在地表二层 12 01 这个大序列下的子序列编号
/ \7 m+ ^$ j- S6 u( U$ b2 ]86 物件层的大序列* {% @4 i- X4 _, C: j- v& m
00 物件层的大序列下物件的子序列编号
' B4 m! J6 k% n( x03 03 00 目前不详
7 Y# P9 j% \8 M) |* p01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。, \# _2 U& r/ Y$ A+ x
- b+ o- p& B( y1 P* s4 G( E
//************************************************************, B2 L4 g' [- Y7 c
// 加载地图基本数据函数;
; h/ U5 H6 V# K4 Q& c) N//************************************************************
0 m6 w6 b' e! z+ h2 _) e/ W" f
( `5 @9 `3 H9 b" u' @) _//************************************************************# `" ?/ y6 U* B9 K3 Z+ x& P" V
// 加载地图基本数据函数;
. B4 o1 ?+ s A$ Y& H4 L1 W//************************************************************( `1 c1 ]6 {0 b% R
0 r, a' _+ V' [; g3 `( fint Cmap: oaddata(char *filnam)6 e, S5 S4 {% b* Z& u
{
4 R# p" i1 z5 D7 o int Temdata;8 ?4 y& v9 c7 {7 N0 y9 K$ u3 A8 K( j
/ h9 {7 |9 N% ?' K! M/ r) N if(filnam == "") return 0;1 S: q6 a# h, W7 i p4 C! Y
9 _% X: O1 R; ?& P& }5 r8 ^
fp_map = fopen(filnam,"rb");7 |# w, V0 S, E" a
" f6 t5 ?! g1 ` if(fp_map == NULL) return 0;
% J- W9 |- _, s/ U3 S J) q- P- q8 N1 l9 y3 d, b0 v
fseek ( fp_map, 16, SEEK_SET);
) o; O( ^' W( f: J: Y( Z9 o& a; w fread ( &ShortWidth, 4, 1, fp_map);% ^" H" _/ Z0 p& h. g- F
fread ( &Width, 4, 1, fp_map);/ _; v% t+ c/ `2 V
fread ( &Height, 4, 1, fp_map);
7 ~7 l2 e+ G* k. |% o! v; F6 N2 B
int TW = Width / ShortWidth;
. A( Q5 g) N, x7 F" A8 F: V int TH = Height / ShortWidth;( ~( H7 s v- [
: C5 K% p* m! n% ?8 t1 H0 k for (int j = 0 ; j < Width ; j++)
4 f1 b. _, ?9 w0 b; C {
1 ^6 t3 k1 a7 V: W _DELETE_ARRAY(Cell);+ ?$ M( D I; `: g. u
_DELETE_ARRAY(Role); K3 Y" T- a5 O5 v
}
3 w) `$ G: g' U2 Q; V9 Y% [* j0 S" |% k( N
Cell = new stCell*[Width];; j! x! a$ r* j6 n z! B
Role = new stRole*[Height];
8 C' e/ @' c: ~ for (j = 0 ; j < Width ; j++)
W& p0 z/ _ s& J7 |! v. K {4 R1 A P1 ^( b1 a! M2 f
Cell[j] = new stCell[Height];
. f' z% I. q: \) \" O' S3 _1 S Role[j] = new stRole[Height]; % Z8 V2 `" e Z& O l
}
$ U% ^/ M8 n/ v
$ r+ N' g+ j7 q1 U fseek ( fp_map, 28, SEEK_SET);
% S$ [( G/ P Y k2 `* X/ o+ K7 u* ], t! w1 k# m9 f
for (int y1 = 0; y1 < TH ; y1++)9 e/ n8 F& d) `
{
( O2 M6 l% {9 k" z9 ]6 ] for (int x1 = 0; x1 < TW ; x1++)/ t6 X w0 m/ m! `
{- U' b3 `7 z2 h- h9 V* g
fseek ( fp_map, 20, SEEK_CUR);
6 G0 t" m, I2 _0 L3 m for (int y2 = 0; y2 < ShortWidth ; y2++)
; I- q* a! M: m" A+ Y; z- S9 f {% g3 S' s9 F/ i+ b ?5 u
for (int x2 = 0; x2 < ShortWidth ; x2++)
- `/ g" o: `' {6 H- i; a9 m {
2 k8 b. y7 l# z7 P0 { fread ( &Temdata , 2, 1, fp_map);" t$ u1 ?2 Y" Q) ~
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;8 w, _* s# l3 I
% }$ P" u0 S. X( H# {) M2 a% t
fread ( &Temdata , 1, 1, fp_map);% q( i: n' o" [1 t3 W8 U# T
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
$ B2 u+ f% C$ Z7 Z) n m# y! m3 ? c7 p+ H& z1 Y7 k
fread ( &Temdata , 2, 1, fp_map);
5 A# K: {5 r+ r/ Y7 n Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;8 R [5 b/ J5 j! b
# p) d4 B6 z; @8 b
fread ( &Temdata , 1, 1, fp_map);. [3 c6 i3 C# C( E
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
. O! I& F! M* H9 n% E) T! B // 6个字节% \ _' t% q: f9 R
& s7 y& t, ~4 C5 g8 u& M/ b+ E: m
fread ( &Temdata , 1, 1, fp_map);0 ?8 h& e8 ~# R/ e& y
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
& \! k" U8 X0 f, G6 N- p& y3 `1 \ % R5 M8 x* ^$ V5 P6 T$ z
fread ( &Temdata , 1, 1, fp_map);
6 ^* V' y$ N; O* \9 G! p5 R4 L Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;7 L# O K8 U1 z0 z% i6 l! b
f! e2 ^6 _$ ^ //fseek ( fp_map,3,SEEK_CUR);
( P* d- p# x- b) h( t. v) `3 O fread ( &Temdata , 1, 1, fp_map);# l; X( v, v1 V8 S* B9 [- q
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
T F9 A8 f y; ~ " w# N9 C5 K: n2 s: M0 @
fread ( &Temdata , 2, 1, fp_map);
; [3 i6 Z) A0 Q/ P7 a4 g3 H3 { Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;6 r+ g: d( e! \& q4 l" F
% b& i \2 R( c0 w3 A/ T
// 1个字节( h5 M+ T2 t" Z4 [. d4 d
fread ( &Temdata , 1, 1, fp_map);
0 I" A' N! M7 V9 n; R# g# q Cell[x2+x1*40][y2+y1*40].CpType = Temdata;0 P% m2 ]; f% q4 r2 l9 E9 N' T, a
//if (ftell(fp_map) > FilZize) return 0;& ?: U, K8 X% F) \6 m" y
}, ?- Q5 Q1 e( t9 p$ }& O, ?
}" z$ e; C' i* |/ Z7 A
}8 ^6 E* G/ t# i; _
}9 w9 L$ w. @9 e% [7 G
! `+ Y7 ~' a0 \& C
fclose(fp_map);! B, \; P5 [8 b1 m! ^5 L0 \
% y2 I9 d+ T8 N) j k. R% q8 k5 w
* s' K t3 h5 n return 1;
$ O$ c8 `: q3 `8 ~- e1 u} - a; P) p6 k) V
|