*.map 文件是记载地图信息的文件。
7 t% f& @ J8 S+ M- Q& Y5 Q) t0 j# @1 R; C
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。; V0 O" @2 a6 F+ S& x, O+ _9 c
& j% \& M/ i* w+ B' r 第 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 地表一层的序号
9 ^, J$ R) G0 f/ o2 {3 O4 S; n* @$ ^5 J2 J% N$ r
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号' E7 `; u# a" L! z- u5 H
07 在地表二层 12 01 这个大序列下的子序列编号* {$ i! P& V" j7 f
86 物件层的大序列
. @( a3 z% p! J- ?$ B6 a0 s6 T00 物件层的大序列下物件的子序列编号
, `! Z$ Z" Q+ \03 03 00 目前不详
1 J+ Z( \1 n4 ^5 g5 k8 [01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。2 b$ z. W, P% H1 j# }3 }
$ _& M6 K# D& ^7 W% C5 E
//************************************************************' V/ ?6 q0 B" Y0 v e
// 加载地图基本数据函数;; p. z |- z1 Q+ l! K
//************************************************************# K3 W6 p; u* |. _" r2 _
: x* ?: n% W. P( P1 X. I//************************************************************
5 \" b0 n$ c8 e( \5 x. E, u// 加载地图基本数据函数;8 t% B. G/ X6 P+ b, J& Q
//************************************************************, w( A D! P* x2 S' T. L
' [7 u. u/ i- q' M6 M$ k+ Qint Cmap: oaddata(char *filnam)( i$ N/ m" z8 j: W: D# M
{0 G/ i) C: _1 n
int Temdata;3 u! n3 _. E x: K# z# U
4 f( m' l, r3 \* p. ^* V
if(filnam == "") return 0;
# g& C9 `/ y' z9 E6 }, o$ [. i p6 H0 Q8 \7 W( g; R& O* B
fp_map = fopen(filnam,"rb");
2 l A/ q* V* Y$ C4 E+ D1 A4 l/ [( ?+ n& R
if(fp_map == NULL) return 0;
3 n+ s) S3 b( u( c; Z$ g& u5 q7 C' P/ U3 R7 D
fseek ( fp_map, 16, SEEK_SET);
: |3 ]: K+ ]7 d5 w5 o4 x2 n( Q: f4 h fread ( &ShortWidth, 4, 1, fp_map);7 Z+ W/ J+ F% ~# |' ?+ `2 Z" D$ @5 c
fread ( &Width, 4, 1, fp_map);2 J3 q/ u; Z4 s; S" ]. W
fread ( &Height, 4, 1, fp_map);8 J, f0 ?- {' \' ]) j6 \1 \
+ ]1 q1 k5 h! K. | int TW = Width / ShortWidth;
/ Z3 @6 }3 g( p) y/ h, | int TH = Height / ShortWidth;3 x# P J) r( p8 U
4 i7 b( A8 K/ T5 ~
for (int j = 0 ; j < Width ; j++)0 P$ l9 N. u- I A7 X8 a
{
& Q+ Z; O: i$ z9 _ _DELETE_ARRAY(Cell);
$ ?% T! a1 c& x+ }- x _DELETE_ARRAY(Role);9 H8 E$ J, z: K3 T- ~3 ]
}- j/ @+ W# L8 B' j
& b' [- _" e5 T! c1 ?+ V Cell = new stCell*[Width];/ F3 K N; T; D: }* p3 u: v
Role = new stRole*[Height];8 A. \" i( ^# y5 X7 k
for (j = 0 ; j < Width ; j++)
' ^$ w% j( |6 |5 K# N {
; y* P5 x/ F: y Cell[j] = new stCell[Height];
4 P& p$ u( _! r' v Role[j] = new stRole[Height];
I$ O$ Q( f4 u* o! \4 x' [ } . g8 F: ^- C: g2 L- E0 _; w G
: q1 g h! J7 D( w& b
fseek ( fp_map, 28, SEEK_SET); c# l1 C( W9 M: W5 r5 |
- ~) _! t3 ^8 \* X) n for (int y1 = 0; y1 < TH ; y1++)
' i3 ~' B0 {: y" q: A, \ {
/ M- c: i2 w$ f( b% h for (int x1 = 0; x1 < TW ; x1++)
" w0 h! h/ z% d I- M {8 V. B& y2 ^+ ` H3 B& }
fseek ( fp_map, 20, SEEK_CUR);8 _) `6 V9 X4 x, G, m7 P( [9 h( T
for (int y2 = 0; y2 < ShortWidth ; y2++)
: A0 W5 R) @- m { g! g5 ^# u: d$ m
for (int x2 = 0; x2 < ShortWidth ; x2++)4 n" A b$ ^& r7 e, ^ L
{5 w( k2 P* _; N6 R% d" p& {
fread ( &Temdata , 2, 1, fp_map);
% Z. G0 s) l1 C8 c" e# _+ i Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
- |/ G1 L. Q* M4 o ]( K* `; ?1 J& g- }/ H1 ~5 h
fread ( &Temdata , 1, 1, fp_map);% ?1 V2 S C" a2 B/ t& l, m5 c7 O
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;6 j, P# }4 Z* H, J
3 w x4 O6 H% N; l4 e. D
fread ( &Temdata , 2, 1, fp_map);
# `4 k- r3 T3 S) C4 |. T Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
! z( U# M0 x/ ~5 g6 N) x) \6 e7 f# k( r, l2 @
fread ( &Temdata , 1, 1, fp_map);5 c" ^ ?) b ?+ o" A
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
. L; N. q8 k, l9 M$ u; ] // 6个字节- W+ P, A6 u- P1 M3 I
; A) l# g7 V8 n( U$ \
fread ( &Temdata , 1, 1, fp_map);, j% V1 n8 t( X
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;1 ]! {; m8 D3 e
* S7 K% B# @ [7 ^, ~
fread ( &Temdata , 1, 1, fp_map);
/ R9 Y+ E% z4 [! t# c4 ?3 h- }, L Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;1 G7 B( H4 V. p& d* \
& [$ v: s8 T1 L //fseek ( fp_map,3,SEEK_CUR);, V7 v" C7 i& k8 `# \* G
fread ( &Temdata , 1, 1, fp_map);
" ~1 t1 M" k/ z9 q, N Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;. I! f$ l( Q4 n* n% _, n4 u2 a" r$ @
* p5 B4 G0 i& G+ _+ L$ {$ E8 f4 E3 \
fread ( &Temdata , 2, 1, fp_map);
8 [/ x. `4 y8 `8 G& x% D$ m, H5 S5 o Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
5 S$ Q% F2 T' Q/ e8 z+ G4 R( K2 _4 }/ U: e# c3 n# b; x
// 1个字节0 n0 ~3 Y9 O7 ^, j% `" r$ S
fread ( &Temdata , 1, 1, fp_map);3 s" Y- [2 {) h n3 E
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;+ u; q q a) I1 \9 m; K
//if (ftell(fp_map) > FilZize) return 0;
; |7 T% e3 d2 b7 e! i' p }2 T% N; r! Y) _ ~! T8 y- e' }! N
}
( D/ k. Y7 }0 W h; _' A2 w }
# e3 S& b2 d+ g }
% ?; t* t+ |# B
' r' K; L; z5 x. G) a. ? fclose(fp_map);6 o' |; b0 V0 T. Z0 k
, U# K" t: p" h8 Z4 v. Y
+ ^& W; K5 y$ z f
return 1;" ^3 L# k) b" }/ [5 k! k/ Z4 F
}
7 A3 }/ u m1 m, n) r8 Z' C8 d |