*.map
文件是记载地图信息的文件。/ B% a- G9 E1 [: M6 X6 i/ X% F
! E* `; |* D2 _( M
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。& p5 x. g9 u+ ~6 ]
9 X3 K C. r# E2 S! I0 X3 [' e4 r! C 第 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/ ?6 k z. P }3 @- X5 p
# N8 x+ l2 H4 v: F( m03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号. B0 _2 R9 D# B$ u% g& d5 y' A& O
07
在地表二层 12 01 这个大序列下的子序列编号
6 i/ n3 g% u1 p* w0 l3 P0 O9 C86
物件层的大序列5 B! f I7 y1 S8 M, ?
00
物件层的大序列下物件的子序列编号4 O `: y$ A$ c- l7 m7 s$ B2 R
03 03 00
目前不详+ H( b, p! r' T3 N S# _5 r
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
; C2 A2 _* G5 }: j( W7 O0 K: G/ L: B1 y4 {* b( M4 L
//************************************************************
' U2 W2 t- ^( d& N
//
加载地图基本数据函数;' J$ i: ?! O2 R9 P2 [
//************************************************************
% t. O: N( ` ^3 V3 G- A6 U" O! S+ r$ b1 l7 F% }' j9 M
//************************************************************
8 E( H7 C# g7 [//
加载地图基本数据函数;
# m R# w$ b4 T9 ]) I//************************************************************
$ i0 }' k* q5 S) O. r" M" j! t5 R! ]" K2 o, V# y
int Cmap:

oaddata(char *filnam)
t A# ^6 W; @: N X+ V
{
^# M1 u" r s- y6 F ^* ^# t
int Temdata;
: ?) x9 r1 K% e+ \! c+ T9 J+ b8 Q/ O# V+ u" f! ~
if(filnam == "") return 0;
! M7 V0 l9 a/ `* W3 B" N1 n* Y: e% x, B
fp_map = fopen(filnam,"rb");
) E6 s+ z6 z% A0 A8 h5 m! L" }! d
, P# n. q7 e9 l2 F2 E' K: b
if(fp_map == NULL) return 0;
" @( g" j, s5 Q/ c* ^1 K& b9 g
/ n0 p z: w' _, |. e: i) R6 n6 E( A
fseek ( fp_map, 16, SEEK_SET);
0 r5 H$ g# E, `8 d: {. i fread ( &ShortWidth, 4, 1, fp_map);
% ?; W8 E. c! I2 |: A fread ( &Width, 4, 1, fp_map);
2 q& W1 w! ^1 L& t% C' A! G fread ( &Height, 4, 1, fp_map);
w$ }* J k4 u3 Q$ @# L
( w' ?4 ?! \1 s# Q
int TW = Width / ShortWidth;
- w7 [3 u5 L/ H% A+ W8 G8 h& K int TH = Height / ShortWidth;
]/ n" i( s1 |; E' G% m. @, |8 t. w' C7 N
for (int j = 0 ; j < Width ; j++)
) m/ f2 @# m4 V) R' r/ z v {
+ r( T' H2 o; D d" a
_DELETE_ARRAY(Cell);
1 k; d% z8 ?% E
_DELETE_ARRAY(Role);
: T1 [. k# X3 q! \: j( }# A8 a }
2 A4 q' q! o% x
. a( s) t; l7 H1 T; G Cell = new stCell*[Width];
C& j$ }; @- M B Role = new stRole*[Height];
R1 \8 ?: g0 T0 x$ \# c: S for (j = 0 ; j < Width ; j++)
' o3 F$ ?: v( ~3 ~ Q
{
n2 ?0 v0 C4 J# W3 p
Cell[j] = new stCell[Height];
b: o. f+ ^9 h8 t- r! T1 E- t Role[j] = new stRole[Height];
. U8 `# s: E( G! K+ l' G
}
- O- F% ]. g6 ~# n/ l" m6 }
, i: t$ g1 E" e/ \1 i0 z# o fseek ( fp_map, 28, SEEK_SET);
! U& C! m- C0 C0 x6 W% Q0 T7 [6 {, x" ^! g$ f9 _
for (int y1 = 0; y1 < TH ; y1++)
+ h. E6 G, i( x6 o: D
{
& d7 W3 I& G) R
for (int x1 = 0; x1 < TW ; x1++)
/ S- m, O9 o( V/ V {
( h" a) k/ G% y. g. }- G fseek ( fp_map, 20, SEEK_CUR);
0 J& a, g: z$ b+ S
for (int y2 = 0; y2 < ShortWidth ; y2++)
: _ `/ F) x5 u
{
5 n3 E" ]+ q7 m4 D( y8 ^
for (int x2 = 0; x2 < ShortWidth ; x2++)
5 @, A5 d, D# X) q6 c {
8 X9 q0 c/ N6 x: k. F; P# L) t. w3 a" @
fread ( &Temdata , 2, 1, fp_map);
7 x% h1 t5 c0 E' d# L0 r Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
4 r) [( Y7 T5 Q
' C! n' R6 T5 T8 M2 X* q3 |3 r/ i fread ( &Temdata , 1, 1, fp_map);
. D8 f* x8 W# c: R) ]/ h+ w
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
( |" U) T* W0 u& x' X
1 f) X: o$ n% m6 w fread ( &Temdata , 2, 1, fp_map);
# P/ k9 m* O( A) H. }* ?8 W3 ]
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
. F% ^' h0 C5 W) ^& E
- Q) t/ k2 T+ U fread ( &Temdata , 1, 1, fp_map);
8 A+ Z% ]. B, F( y2 F; D3 ^4 R Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
4 V5 ?2 D7 r$ A- U' P2 H
// 6
个字节
8 Z! J, a8 n8 G+ Z+ T- E/ g" _4 }
+ s3 n" O% H- z5 m2 o6 ]& N fread ( &Temdata , 1, 1, fp_map);
3 ^0 q& \ u, w* V- r8 O( e% a4 ~ Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
' K/ [% y D- ^ `9 {" u3 p 9 X3 _! b! a H4 H: s) n$ K+ N1 A- d1 [9 e
fread ( &Temdata , 1, 1, fp_map);
; T4 w* x* W# J Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
8 U* A0 v# n/ l1 H4 Z6 p* Q6 G) a& g3 t( w* _, n ?2 h, }" J; N
//fseek ( fp_map,3,SEEK_CUR);
1 `3 _! A7 E; A# E0 @
fread ( &Temdata , 1, 1, fp_map);
. a+ @" P. s3 n7 Z# {0 c
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
( _( v2 c, |+ C& `* }1 Q- F0 M0 O' c 5 n' O, J9 G7 X& }( Z" e+ S9 W
fread ( &Temdata , 2, 1, fp_map);
6 i6 F- n% W+ M2 c3 U2 V
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
: I6 g4 s# q+ Q1 Q" S
! [4 p2 R: [+ m2 P7 I- U
// 1
个字节
5 O4 w8 l0 J! s& v" m, } fread ( &Temdata , 1, 1, fp_map);
, Q+ ^7 c4 H( B3 g9 A Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
8 a$ i0 n6 T, L. A& o //if (ftell(fp_map) > FilZize) return 0;
A0 d9 @9 u* p, Y* C
}
( A! Q0 V y6 t8 K7 g$ |; g/ m+ J
}
7 `1 S( E& c$ r. y' [8 ^; m! x }
0 S" {, K% g0 `) ]4 y- g5 W
}
' E5 v2 _; v4 S+ _+ D& O. ]8 r0 g' m" h2 R" I, }, a- v; \2 S
fclose(fp_map);
$ l; b9 B; j( _) z" G
( ]3 U. {- {. r5 d% |
$ C3 P" H, `, s$ b, S* S- { return 1;
/ b; }8 n7 B$ r5 M6 r}