*.map
文件是记载地图信息的文件。
3 |! c2 o( |5 s2 F7 x; C
9 O! ?- x& B( e 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。, w3 f1 ~: t: C; O5 t
: ^3 e# Q8 z N0 u 第 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 地表一层的序号* ]& S6 `5 l: |2 g
_2 e$ D; r) K. z1 S5 m# x4 c7 P03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
2 M$ C7 l% [0 ]9 @9 C# q& A( A07
在地表二层 12 01 这个大序列下的子序列编号
. ]- b( o& r& L: I3 S86
物件层的大序列& A1 D6 A/ q/ s) s1 j6 i
00
物件层的大序列下物件的子序列编号) {" |$ k& ^7 p0 R$ q( m
03 03 00
目前不详! [/ c7 [, l3 o
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
4 L V( W- f `0 ?0 N9 x" z+ N' {! p8 m# [. T7 z2 ?) L
//************************************************************
w4 K+ b% ~4 M1 y+ ~3 w. }" M
//
加载地图基本数据函数;8 S! s& R/ |1 T: ]$ N
//************************************************************
& T, r, D6 l. r1 ~" e. M6 A# p
% r" V5 c- p. x! D: w2 d) {" Y//************************************************************
8 g, S7 a2 n |* K) W" D: O7 {& l
//
加载地图基本数据函数;
9 O% E9 g4 h" ?7 d- N1 N: C2 B0 ?, L//************************************************************
, o- P' B0 c! R
, |: O$ @% N" f$ t9 u
int Cmap:

oaddata(char *filnam)
9 D8 U" |, t9 z6 D9 Q. v2 |
{
6 }$ C3 z1 z; x6 } int Temdata;
N* `- C {. N' F8 \0 O. w8 V# ]8 w5 |! C; @
if(filnam == "") return 0;
( u& R' |* F1 @* {: b: R' K+ p$ N/ V- t# w7 w
fp_map = fopen(filnam,"rb");
+ ?9 S0 b; j5 v9 u# V( C
" I/ h9 s7 O4 V J4 a% X if(fp_map == NULL) return 0;
5 l: O9 B& [8 `! N6 c) F% L
. K- p) a6 T. l2 b( O- S5 n fseek ( fp_map, 16, SEEK_SET);
/ _) ~! ]3 a% ?
fread ( &ShortWidth, 4, 1, fp_map);
( l# D6 E6 N( e1 R$ U
fread ( &Width, 4, 1, fp_map);
& g# I! l$ I3 p; Y
fread ( &Height, 4, 1, fp_map);
! q$ \. O b6 g* v8 }9 N5 A; H' R [( k% D& g" t3 F
int TW = Width / ShortWidth;
: R: ]( R$ T9 L6 H7 w int TH = Height / ShortWidth;
( y* @8 s1 i: `. Z( t. X1 z: t, }. b. Y6 h
for (int j = 0 ; j < Width ; j++)
) B; b) E) C( t1 _ {
, Z7 J. a/ ` o% t* A _DELETE_ARRAY(Cell);
4 Z: X& n- _( T _DELETE_ARRAY(Role);
/ |! b' ^1 m9 z+ n Z8 s }
3 @2 }2 a) F5 T8 y& x r2 y; u* t* E/ {" h3 r! g; f$ e! Z
Cell = new stCell*[Width];
8 ?5 _( D2 k+ ?0 z- Z3 P
Role = new stRole*[Height];
7 x# s2 b' E) i. `. Q: e3 w- W `
for (j = 0 ; j < Width ; j++)
4 T8 y2 a! }2 B* Y' y; ?9 F
{
3 J+ e9 B+ A u3 t6 B a
Cell[j] = new stCell[Height];
& i- Q0 ]+ V8 |
Role[j] = new stRole[Height];
) ~! g0 k, ?% ]8 A }
$ \; I4 Z' R9 X) d1 c' V0 p
8 }' y+ D6 D4 \ fseek ( fp_map, 28, SEEK_SET);
; @) k9 M; m s6 C# I) [
4 u4 i) j+ q7 @9 _2 { D9 n3 G
for (int y1 = 0; y1 < TH ; y1++)
# r) z' ^% }# e. A/ \: i
{
: F( Q; `7 q. a& Z; F for (int x1 = 0; x1 < TW ; x1++)
2 U8 _$ q9 o; d& |% g( {6 S' u$ s {
! k2 e5 ?0 q3 I, x fseek ( fp_map, 20, SEEK_CUR);
3 B6 K% P+ h% k$ o6 I
for (int y2 = 0; y2 < ShortWidth ; y2++)
* o8 w7 o7 T: V; e& t/ X {
' p+ a6 I4 [$ K+ \' r4 U for (int x2 = 0; x2 < ShortWidth ; x2++)
o2 J! \6 I, Z9 I6 T, Q
{
$ O- s( G% K6 a- Y6 u: r& T' u# K fread ( &Temdata , 2, 1, fp_map);
. ^4 f5 H9 ~8 u/ V5 u6 {# P4 p+ @) f
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
. p' x, a) d' F5 y' [: |
" b6 L% e, C$ X# Y( E% j. v1 x fread ( &Temdata , 1, 1, fp_map);
+ u a1 U* N9 O' D0 i
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
( q, l3 M5 W4 X. ] Q, j2 q1 w0 n+ P9 a& l6 l( C8 K
fread ( &Temdata , 2, 1, fp_map);
1 t- X1 n% i, e) J9 o9 H% y Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
: u( H) X- T, N4 V1 ~/ L0 E1 f# o
# v/ A/ O$ O" C" N
fread ( &Temdata , 1, 1, fp_map);
7 k. u1 Z0 \7 [4 r, o Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
$ j: `1 v8 x I* R // 6
个字节
' w8 ] c- g4 f a! a& j& d- R4 J P" i, d g
fread ( &Temdata , 1, 1, fp_map);
" }2 w; r0 m! s' t( I6 S Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
8 S, I+ U- h: Y2 M/ Z1 M' q2 N
& y8 \- t! m b- Q& m fread ( &Temdata , 1, 1, fp_map);
% h7 G1 J% i1 G4 Q, P7 e' Q
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
0 n8 ]" l" o" L+ ^% z& u
5 N- A2 }' ?7 ?+ V0 J
//fseek ( fp_map,3,SEEK_CUR);
; \4 d7 F$ A+ f0 W7 y) }' ^
fread ( &Temdata , 1, 1, fp_map);
3 R! L0 P3 y7 P. X1 o
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
0 N! N- N5 E1 S. @4 W3 Y* v3 O
1 L/ N* E- H- K1 b! E- N' ~- ?0 @" { fread ( &Temdata , 2, 1, fp_map);
" \9 X; G9 a+ W3 y2 o& p Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
5 A" w2 K5 i7 f3 q/ n3 l" |
3 B; o4 S2 D# t // 1
个字节
* y: I. o! S# Y fread ( &Temdata , 1, 1, fp_map);
6 [0 `+ ?9 H$ E( U1 W, ^ Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
6 k" r. S% k3 H: u' m6 Q# d8 \/ u' g
//if (ftell(fp_map) > FilZize) return 0;
% E% d! Z9 }; m" G6 C3 p
}
5 M1 `6 q! z& O
}
2 r0 s3 O( D, A; U9 F& }
}
1 `8 |$ q2 C& D" Y2 c' v
}
! K4 C) a0 R" g* l' r0 b5 Z9 T W' L
, ]% G z1 c7 n* z; o3 B
fclose(fp_map);
0 z5 t/ i* {0 |+ P4 g7 A% T
- _$ `, M% x( G( [7 p3 p9 j4 b
! b$ w- p5 }+ | return 1;
" e! O$ H' K0 T3 P! `/ L}