*.map 文件是记载地图信息的文件。
4 F# ` q; `2 _4 T1 Z9 h5 ^- Y5 ]( P; S/ f8 p: Q4 k
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。. j6 Q* F- p, x P& g) x3 u+ ~
: s5 p- i; Y/ ? c. g2 T
第 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 地表一层的序号
7 _ H% t: e* h( R4 \' M: N
3 C4 ?$ K+ F0 B# p+ V& C! {03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号% O8 C/ H1 [# G+ r! E
07 在地表二层 12 01 这个大序列下的子序列编号
& K, v, M: F: b' @86 物件层的大序列
l: i9 V6 S% w" G0 Z9 O* x00 物件层的大序列下物件的子序列编号, q8 m$ L1 H* G* ]
03 03 00 目前不详
6 D. v* m6 k8 {( ], K( Y01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。! F( {' D, K; O
, [% c8 e* z1 v: B8 p9 i- P//************************************************************
; m6 o: Y' @' s* T0 F9 k. H// 加载地图基本数据函数;
8 D* ^) D) M3 \# Y1 L1 C+ d9 B//************************************************************( ]* w9 {: ]$ Z8 x( J3 o$ n5 }' q
( R+ D, e+ k5 q- A5 \5 \ `
//************************************************************
/ b. p; w: ?. ~0 X) `! \// 加载地图基本数据函数;
( T0 ?# h- W, R( o//************************************************************
& W, ]; d# O7 `( W$ {; Q" G: r; `9 o( V5 g7 u
int Cmap: oaddata(char *filnam)
. u. C0 }* |$ b1 u* T# a8 d{4 v8 d* e2 z- K6 D
int Temdata;
; e" m$ ?2 d$ F& I+ k3 Y/ P
. i- v: d" I; L6 \. _1 a if(filnam == "") return 0;
3 f( N5 z6 t/ o5 v' C7 q+ F* Q/ j K; A6 y# t# I2 ?0 `+ B
fp_map = fopen(filnam,"rb");
: ^9 |, X$ o F" e( w' `) z B) m2 m+ W( t1 m! N
if(fp_map == NULL) return 0;$ G! g. F* L$ m6 e P/ S$ Z" d
3 q4 I' T) g- ]. ^ fseek ( fp_map, 16, SEEK_SET);
/ T5 _2 B. {( s' l4 _$ k1 U# E fread ( &ShortWidth, 4, 1, fp_map);" a( N0 s& ?' g. u7 u& N. r0 K, ]+ X
fread ( &Width, 4, 1, fp_map);' v* i6 Y1 V: d& E" V: i; z$ E/ i
fread ( &Height, 4, 1, fp_map);
! {6 E3 F, j# E# G& k( ?4 r
$ |7 N: J0 f4 e int TW = Width / ShortWidth;
" K/ A3 V, ^+ z+ h# h v' @2 z1 q M int TH = Height / ShortWidth;6 N8 ^) ?: z, s4 r- m
5 O# x3 |8 }7 M! g5 m! I; ]) v, `8 X) o: z for (int j = 0 ; j < Width ; j++)" a: c- R2 {3 A2 G" g% Z4 d% S
{
X! d" s0 z2 z# o* c5 F ?; ]5 a" [ _DELETE_ARRAY(Cell);9 j, j) A& v* H, G3 E
_DELETE_ARRAY(Role);5 C( _. e+ X0 I+ u3 }& L) T
}4 N: q0 K: f, F/ |! \1 D4 U
4 q* g z0 Y! U( } Cell = new stCell*[Width];
* m c/ t7 P7 O! | Role = new stRole*[Height];7 m$ x# m& h1 |# O8 z7 e/ Y+ Z
for (j = 0 ; j < Width ; j++)
! v; A: p, N' {0 P- w4 h4 U$ c {* F& B! x2 e* G
Cell[j] = new stCell[Height];
: b1 r$ D/ n& s' w( a8 }7 w4 r: U2 m Role[j] = new stRole[Height]; + Z! B6 I+ p& L7 E. o% Y
}
( V: b) {( Y8 f4 n
2 e7 y& O H3 U4 M4 s- X( G+ E1 c; ]2 i fseek ( fp_map, 28, SEEK_SET);
4 ]' c$ o$ f' g6 ?$ V# w" T# g9 a! b, J5 ]- a, n) K8 m% l9 r
for (int y1 = 0; y1 < TH ; y1++)3 z& ~1 E; o0 M& q# q
{; ?5 U: L- F$ R" I
for (int x1 = 0; x1 < TW ; x1++)
, z7 C9 c6 P1 z {4 ~# ]. I* [! c6 [, [- Q( U
fseek ( fp_map, 20, SEEK_CUR);
8 e7 u% R' u! `, {0 d/ z6 i for (int y2 = 0; y2 < ShortWidth ; y2++)
; [% ?& \ k7 _% W5 i& h {
6 r: w0 D. V3 K0 ^" h7 }: @4 G6 s for (int x2 = 0; x2 < ShortWidth ; x2++)
' ~: J8 H8 u7 P0 W {8 C$ ~+ d: `# v. Y. Y/ A
fread ( &Temdata , 2, 1, fp_map);
6 ^5 R# q6 q' }( _ Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;/ R5 r' U' ~6 U9 e& b
# x9 ?2 L( g3 E2 m fread ( &Temdata , 1, 1, fp_map);( N7 o7 f# C1 {7 S+ g
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
! m5 O6 q4 {! x
- y& H( j0 N4 s, ]- e8 t fread ( &Temdata , 2, 1, fp_map);
! Y8 L6 ?0 e) _9 K& K Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;+ N* z# S! h3 I2 y$ r r
0 H3 g' g1 J6 i; B! _! ` fread ( &Temdata , 1, 1, fp_map);0 Q% V+ i6 J; [$ f R5 `
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;# B9 e, ~1 |) L
// 6个字节; H) O% U1 V! O
4 h; C* m1 C# r) l4 H) ~3 Z
fread ( &Temdata , 1, 1, fp_map);/ {) h# j B1 b$ l# }) k
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
7 r) Z2 l" P- v9 p- b% I1 P
( _1 a9 x4 |) p) b fread ( &Temdata , 1, 1, fp_map);
9 a2 j! |4 o! m( y Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;) j2 w4 i4 I1 L8 D% R7 X
- n9 S) D- ^/ w. a5 ?0 g2 g //fseek ( fp_map,3,SEEK_CUR);
% M0 {7 u8 s+ k fread ( &Temdata , 1, 1, fp_map);
" ~; |: d$ N: W, b; [2 g6 z- V Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;; j* o( @2 B# ?0 _
| l4 ]6 {2 E# N) j; j5 ] fread ( &Temdata , 2, 1, fp_map);
; S# W! R0 C& C3 v, | Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
: M+ P* l$ U/ j4 C( k3 W6 j$ @! d. i( \% k3 ?! p+ s" N( h) {
// 1个字节
& {8 M! W! m, l- }8 d( ]* L+ l fread ( &Temdata , 1, 1, fp_map);" d% ~" C$ Z% v, ^
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
6 G' v* y! D0 T2 A& l; d- ~ //if (ftell(fp_map) > FilZize) return 0;
6 `) q, h' R6 `. L6 z8 T; f( o }
" y3 e/ D3 c$ v6 _4 `1 L6 z& X }9 O6 x5 T9 B- I) s# _' f, ^
}4 Y: U9 Q! ~. A( z& N
}9 ~3 g( O( j9 U$ e
0 F; Q- g2 `) ?% E
fclose(fp_map);1 s, k' C: [6 B
& b$ K0 P3 `, K9 d" M P
/ g0 e' S7 D N* C; l) c& U return 1;; p8 | G4 m: ~1 w# _, Y9 N. s
} # u% s3 D; l. ^" @- |) k6 G
|