*.map
文件是记载地图信息的文件。% H6 I0 I6 g8 |
) I) e+ P; q4 t 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
4 o* V# B: O9 [! i, o$ w5 H# Y
9 S' P1 J* V/ ?+ K0 _6 t, b) v' p 第 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 地表一层的序号
f. Y' | _" U- K
& t9 d( M% |/ M' P03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
1 V( q) V8 N/ n7 n4 b/ Z3 v' L/ {07
在地表二层 12 01 这个大序列下的子序列编号0 j/ m; w7 A3 P# s
86
物件层的大序列0 M- d3 J3 ]: T6 E$ Y7 U5 @
00
物件层的大序列下物件的子序列编号: E, f: [& v; f( i6 R
03 03 00
目前不详
: q6 Z% k# D z- k* A2 k01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。. `6 m' t5 C6 ^' M. S
, Y! L' W7 B3 }7 R2 F0 D9 W//************************************************************
) b' W3 R$ t: l' W6 I
//
加载地图基本数据函数;
( j8 ?5 R- x6 j0 ~//************************************************************
! L+ D5 E+ u% k, g
9 p$ d# c- L. l7 P//************************************************************
+ {* q8 [# t" ^. d- `
//
加载地图基本数据函数;
' L& @5 P% [+ |3 m9 @! @6 f) d//************************************************************
! {' ^1 V) K( ^- N$ f
! c: k9 i* i: Y5 e% u+ k
int Cmap:

oaddata(char *filnam)
, g! I5 u: }& P8 w8 T5 N
{
# ^% Z) s. _6 U/ F0 f
int Temdata;
2 j2 K' J4 C$ o
4 z4 `' l/ N2 v6 d- b( w6 F if(filnam == "") return 0;
^& o' {( ]5 S# t" } x" _
) r, _; z0 c& R8 b# W+ A& b7 J) b$ {3 S
fp_map = fopen(filnam,"rb");
( d3 ^' ^9 h' Z5 C' c! }& r. I1 h: r5 t9 m# ?& X
if(fp_map == NULL) return 0;
% V$ v$ c3 P/ U* Y: o1 g
8 H4 e7 y# n, P. q! ~( D fseek ( fp_map, 16, SEEK_SET);
* P& b- }- ?" E5 \/ F6 t fread ( &ShortWidth, 4, 1, fp_map);
# s8 C2 @& u! J- k fread ( &Width, 4, 1, fp_map);
; B% P- V' F; R6 c fread ( &Height, 4, 1, fp_map);
$ H f2 C2 R2 \" O
3 r* i' Q) L+ R+ z- V
int TW = Width / ShortWidth;
; J/ N" j3 u w0 s2 ]; J# ` int TH = Height / ShortWidth;
* K% e) d5 p+ V3 m# {- |
4 [, u5 o* W# e9 p
for (int j = 0 ; j < Width ; j++)
& L; q! f, J8 c1 T
{
e6 o; T8 ~& o# u _DELETE_ARRAY(Cell);
9 w D+ k$ c" s# D- R/ f+ W6 P
_DELETE_ARRAY(Role);
1 [# Q+ J; B- Q! U
}
4 g4 Z5 s9 [% Z& F% e) ^' }: b w; H. T: r1 J- E3 m& u* F7 d8 X8 G' t
Cell = new stCell*[Width];
! m+ ]+ Q; r1 ^( u4 A/ d8 X Role = new stRole*[Height];
9 n& h) r: T8 w+ @$ E# H' ]+ D
for (j = 0 ; j < Width ; j++)
" w" F9 M& y2 G {
2 V6 Q) B2 u) n* m2 Z! C
Cell[j] = new stCell[Height];
6 ~- @8 @7 i8 O Role[j] = new stRole[Height];
1 U2 }) N3 T( O1 u: x, t }
& L# b- d# R% J
* d' \2 {$ i K! I
fseek ( fp_map, 28, SEEK_SET);
! w) \* {! k7 W7 |1 R5 p! s
4 _- r s! W9 k# H for (int y1 = 0; y1 < TH ; y1++)
- n7 l- N7 T2 N0 `$ |3 p {
) b. F3 q6 d. v
for (int x1 = 0; x1 < TW ; x1++)
# ?5 Z1 V7 u5 u; _6 g {
, h; D! v7 T3 T% Y$ t
fseek ( fp_map, 20, SEEK_CUR);
; m* p, I ~4 R
for (int y2 = 0; y2 < ShortWidth ; y2++)
$ s3 d5 y! u4 E" F {
9 O0 }" f: h' ^; t6 @, C
for (int x2 = 0; x2 < ShortWidth ; x2++)
( b+ x+ i; B% t, n1 z
{
. p1 b! u: j: y' W5 }" s
fread ( &Temdata , 2, 1, fp_map);
2 E9 O& M S' I$ n* {
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
5 v4 p# F5 x9 [( t: G
0 n- d- H! k' ^7 Y7 l- @8 d fread ( &Temdata , 1, 1, fp_map);
2 E( v2 D3 E" F0 k( v1 e" d Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
: L; `# I' Y- f6 i* b$ @ N
K. l& Z' v, `6 W+ m+ p+ d fread ( &Temdata , 2, 1, fp_map);
) Z$ |" S: B6 t" A% k. u
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
+ v$ V4 E1 n) D/ \# B5 {
0 ~- ^7 ^+ z+ ~0 O3 x( E) O# d* V0 T fread ( &Temdata , 1, 1, fp_map);
0 g9 ~$ g3 W4 j1 z/ j! D$ r! \8 R
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
1 C" H2 p# B5 _; Z
// 6
个字节
) O$ O7 A W/ W' L) U7 K3 S+ k+ d. H% H0 @
5 T% Z8 V1 s6 i7 b" V/ q m fread ( &Temdata , 1, 1, fp_map);
( K, ~4 E& x7 v" u
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
D( D3 ?: D0 T
" o) [: j$ h% @2 g7 W2 o
fread ( &Temdata , 1, 1, fp_map);
) m% N; P7 X7 Z
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
0 F3 ]; o' G/ S
# d* I- q& o/ T: q, \0 z0 K7 E9 u
//fseek ( fp_map,3,SEEK_CUR);
& W8 L. X# [) K2 ~2 l& N. y5 B2 w8 I1 G
fread ( &Temdata , 1, 1, fp_map);
: S7 t" f1 @4 w5 g g9 T
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
# Z; U& {( O) h, q! x6 |
! a# G6 d' n0 V9 m$ m fread ( &Temdata , 2, 1, fp_map);
- q4 i: F2 @3 K& o' C" ? Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
' l( q6 O( O0 C3 b5 y3 Y# d5 g
# c- _: k7 C9 A // 1
个字节) ?! G4 O: Z9 O, Y( L6 i- F
fread ( &Temdata , 1, 1, fp_map);
- p9 N; e7 {, _* E# P0 M Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
) F R8 H2 {7 G7 M2 ^/ K! D1 Q //if (ftell(fp_map) > FilZize) return 0;
- \( [. y8 Y+ w( S) u# | }
# h2 B( e( Q: R+ d0 Z* C+ W
}
$ f# b' U% B1 s7 [ S
}
, X1 N& E3 ]9 _) e+ Z }
% D( t. k4 q# q P8 P5 K1 x% ~# i$ W/ G' R8 \
fclose(fp_map);
- c* i0 Z) r a$ K6 J5 o4 M" R1 j* q. s" g' S) l
' q9 ^, Y' ]" _/ l/ C- q
return 1;
! {" H& B7 W) l7 D$ z
}