*.map 文件是记载地图信息的文件。
3 W2 N H* J5 W3 j, z- S# ` e; L. i' j6 V0 e* a
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。, s! ?5 I- B9 C4 G/ s$ K$ L- O
^/ X7 }+ n( D: d
第 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 地表一层的序号
( }4 L; _4 Y; t* I* m o
4 ]( X6 K9 H- ]* a8 B: f* h+ C03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号, B5 ], u0 y; J2 z% [
07 在地表二层 12 01 这个大序列下的子序列编号
. w( j3 l7 l2 h3 s5 z86 物件层的大序列4 ~6 B8 {" G5 g! I6 w; s6 \
00 物件层的大序列下物件的子序列编号" t; ^% `5 D. N1 z* ]; c
03 03 00 目前不详6 e' A) j- w' b* i
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
; M* `4 ~/ Q- y0 S& R2 T2 |- d
1 J- a: r9 j4 S/ I, e# f* C- Z- N//************************************************************
: M( s- [# G* @3 v: z// 加载地图基本数据函数;
7 R4 |( G2 K9 a+ A5 k A- ^/ P0 |//************************************************************5 c/ [" p5 W5 G. O( ?8 k& _- Q
$ r8 z6 U- h; ~- u//************************************************************) M6 g. Z5 q0 ?
// 加载地图基本数据函数;6 E. C* m! ?! i, O9 @
//************************************************************
2 X7 D2 R: M4 \# b" L [% X( W0 e; M* x9 d9 `4 B' j/ ~1 J1 u4 {% @$ X
int Cmap: oaddata(char *filnam)# D* q, a$ V+ [4 l0 R A* [' o- \
{% H% B w: o4 t9 O& m( q0 E
int Temdata;" K/ v/ V- y( ]2 _
- Y' X: i2 r7 {. }/ L
if(filnam == "") return 0;
' ^' G, i* p3 }: A0 u5 x8 _) z$ c% e# A" {& s E( B7 l7 q
fp_map = fopen(filnam,"rb");, ~( C: s) X% z6 W7 E) q6 p$ i
- P1 }; T5 U T* M6 l' W% Y+ L
if(fp_map == NULL) return 0;
0 B7 ~* H0 ?# b7 j! w, h& T
6 c8 E; }6 p- k$ P! R2 Y: u fseek ( fp_map, 16, SEEK_SET);
( \: f4 I& D- ^0 _3 o' s, s$ w% w fread ( &ShortWidth, 4, 1, fp_map);2 B( z; o V) E, u3 K
fread ( &Width, 4, 1, fp_map);
! S0 e9 S" s! k# {7 K' A) G fread ( &Height, 4, 1, fp_map);. y0 b6 J- j$ V2 l( J
+ R( S+ [" Y, B' |
int TW = Width / ShortWidth;, i6 D ?) J9 Q& S( }
int TH = Height / ShortWidth;
& F5 z$ y K+ ]4 r% E. }( J# a% W8 Y$ f* `
for (int j = 0 ; j < Width ; j++)
- T J( y3 J2 _ {
2 i, ]/ g( u3 z# c' r Q2 O _DELETE_ARRAY(Cell);
1 {% h3 Q) G2 n/ \2 S _DELETE_ARRAY(Role);
9 ?- N% i* m9 [8 a* k* k }
& Q3 J% z4 p8 O0 @
7 E8 X- i( I( p8 E Cell = new stCell*[Width];
5 m$ d. t+ `. }9 b0 k% P9 q Role = new stRole*[Height];) x) j) k N$ o1 A5 p7 d7 J6 O/ x
for (j = 0 ; j < Width ; j++)7 J0 Z$ H# P4 n2 f) T# P7 |* e
{+ v7 m- x# z4 |" D8 D; K$ U1 J
Cell[j] = new stCell[Height];0 Y; B$ ~0 ~- b, @6 k1 A3 @' I$ w" x
Role[j] = new stRole[Height]; $ b3 I( h' F" l( Y+ u4 \4 B. [
}
3 B% b" h S1 n2 T- P p) _" G/ b, D
fseek ( fp_map, 28, SEEK_SET);1 w# K+ O1 m% n5 M& A* Q( ^
# p' p" N* W' _4 u* [1 e
for (int y1 = 0; y1 < TH ; y1++)9 x. T7 k3 Z% g x# _: s9 W
{
$ u+ g( K( Q% ~0 D0 H- e: B" u! V/ l for (int x1 = 0; x1 < TW ; x1++)
6 m5 s8 Z6 Z% W5 f* ]: L5 d6 k {
. h: i0 H$ k l; v4 n8 P fseek ( fp_map, 20, SEEK_CUR);
~, ?1 @* L/ i8 X0 D for (int y2 = 0; y2 < ShortWidth ; y2++)
+ T! X2 H8 K% z6 Z( s; K {
9 ~$ P" ^9 n% F- l for (int x2 = 0; x2 < ShortWidth ; x2++)- S& c8 t" P% r- B
{$ z/ ?, d( J/ D
fread ( &Temdata , 2, 1, fp_map);: p+ e8 r$ Q1 V5 z3 C9 R$ A
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;) o. j& V* @, Y1 ^* k
B$ G# {/ u" T+ ` fread ( &Temdata , 1, 1, fp_map);
, I6 M$ r9 H( a( N5 {6 T* V Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;* v9 x2 \" [" U7 |" j3 K
2 h+ ^' N$ \* w$ f: c# m9 ^
fread ( &Temdata , 2, 1, fp_map);9 ^( E& q3 B6 k& _5 V: g/ s
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;; u% t. A5 x& p, a$ R0 u
4 I, A F; |9 o2 q& M* J
fread ( &Temdata , 1, 1, fp_map);
: [; l, l" R" o* U7 x+ D2 e Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
, F8 O8 x" F% U, r6 Y$ c/ K3 T$ J // 6个字节
6 Y1 j+ I4 z8 ]2 X X0 p- \2 ^7 C/ Z
& ?) q/ ^8 N- N fread ( &Temdata , 1, 1, fp_map); o9 H$ ^& Z# o6 C* f) M. E
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;9 I1 s, y l& J3 v9 d, `
% J" g) Z1 O+ G m; x: ] fread ( &Temdata , 1, 1, fp_map);4 [3 X: i) {3 [9 g' s1 R7 ?
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
' F5 O8 b3 s; Y! D9 W8 r9 g. h
4 d1 F* k1 x" g- u+ ]* p //fseek ( fp_map,3,SEEK_CUR);
8 y# G: c% A5 Z8 [! W, W3 z, ] fread ( &Temdata , 1, 1, fp_map);
9 r, _% w: L/ g' ?/ b# b6 K( }2 J Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
5 B" n( X' q; {# t$ M7 h- G/ n" M , _% S+ {" A: }. G0 h/ u X; O& s
fread ( &Temdata , 2, 1, fp_map);
) x, f2 M1 K: h( e8 w4 b Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
1 B: x5 z/ [# H- ~: {, W
$ W+ R, w8 o0 C* S9 F+ l% g. M // 1个字节
4 H: P/ R- I" N4 F% V, | h# | fread ( &Temdata , 1, 1, fp_map);
% A H& H2 k! o' a Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
' ^% O" [& A% k* _5 R //if (ftell(fp_map) > FilZize) return 0;
7 V$ D6 ^1 ~; M4 \) h ^ }9 B8 K& x! I R" k$ d
}' R5 p# f! ]* U1 n% R. m7 @ c
}
1 c N2 Y! o% ?7 o2 L! h }
2 V; P6 z! q! e$ k3 z% y, F& {2 @5 A% B k. C
fclose(fp_map);
' T. { y1 n* E, M* ?
- G& W4 f6 ]5 ?, n1 R
! g/ o- K& e/ l4 @) V+ B* p return 1;. K& m7 j- ?) Q: V( f; _
} , x% @$ @ F V# q9 m4 |
|