*.map
文件是记载地图信息的文件。! T2 z2 e0 Y. M0 M5 G
G7 i3 D; s+ E3 k, l7 S
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。3 {* W: P/ z- E2 I; o5 e
$ `% g, j+ g' {8 k
第 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 地表一层的序号
- ~0 l. r6 B x) _
7 r7 Z Q: h3 v. x: d7 ]' N03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号: _" i6 b6 t9 Q* J
07
在地表二层 12 01 这个大序列下的子序列编号
5 t0 e' j* `( w& E) \( |86
物件层的大序列# w7 k8 Q( |4 t- o4 X
00
物件层的大序列下物件的子序列编号
8 b+ i" o* N0 I0 G0 X03 03 00
目前不详, l# [6 x: B, E( a5 m% I4 C% h
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
8 N! o% U8 h1 H6 C. B
% J( [: k% c0 Z/ k5 h0 v7 ~( c//************************************************************
+ W' G! v( s2 c$ X+ _% }( _) `& U//
加载地图基本数据函数;1 D4 _, v) V: P* @7 k
//************************************************************
1 p0 Y$ z; F. q; h& k- P/ a8 k
M& g5 p6 ~# f& i: X3 |% ~
//************************************************************
% q; F6 g) Z& J2 l7 v
//
加载地图基本数据函数;
* V5 i; ~% e1 O9 O9 o//************************************************************
+ Q' a/ E6 R' l& M& @1 Q7 y
* u% m) D/ e8 i& N4 P. i
int Cmap:

oaddata(char *filnam)
6 B6 l- F; I; f* E" |
{
1 T7 v( _" D* l6 i$ j1 |# Z' s
int Temdata;
: _( R6 w& e& z f. O; C/ K) r
5 i: _" H% |( K5 N* H1 c* b; m if(filnam == "") return 0;
" R, t$ J7 i- T# q p/ g# R8 ^: ?9 ?1 H2 X$ i# S
fp_map = fopen(filnam,"rb");
7 D2 p9 s. A3 m3 X7 h7 ~
0 o, Y9 l2 U3 |( J: r" v if(fp_map == NULL) return 0;
6 v- R q g. J4 U }
) w6 D% U! {2 I8 m3 g fseek ( fp_map, 16, SEEK_SET);
* |) w4 O2 P( f( a9 k; a2 n7 w9 B fread ( &ShortWidth, 4, 1, fp_map);
7 \$ D" s0 }0 f9 G6 N4 v
fread ( &Width, 4, 1, fp_map);
/ N/ l6 o% x, c+ a: |$ @ fread ( &Height, 4, 1, fp_map);
! }3 j( l+ M M% o2 _) d
( O2 Q! i; B$ E' w2 t; s( ` int TW = Width / ShortWidth;
- j; |8 F" Z$ `, ^ int TH = Height / ShortWidth;
% D3 Q+ w. X0 u
5 {' Q1 y8 d% }) C D
for (int j = 0 ; j < Width ; j++)
5 ^ j0 u# A$ p* @! d) N' F; `
{
% P6 c7 a" V' l0 _" f _DELETE_ARRAY(Cell);
1 |5 t" I2 e3 k; g: Y3 P) a( m
_DELETE_ARRAY(Role);
: u; x* o$ z$ C }
( I6 i2 G& {, A! q7 ~% }' V9 @% V! m- D
Cell = new stCell*[Width];
: G' m2 Y; q7 K% y
Role = new stRole*[Height];
! s9 P/ X( j9 X$ q! z- K5 k1 T
for (j = 0 ; j < Width ; j++)
$ d$ M7 Z1 P+ K2 `* z- `7 T( N8 U! C {
H$ w$ R. j; j9 Y
Cell[j] = new stCell[Height];
, I5 o% u/ \; j+ A4 y Role[j] = new stRole[Height];
! O+ t- ?, n5 h9 \+ C) K }
( v1 R( L, T) Z& J) H
' f5 D; ]5 ?: r! a! ]5 S/ C1 b fseek ( fp_map, 28, SEEK_SET);
( ^# l9 G& x) \# K. _) U: Y" H
) a- w: P2 r1 U, d. f2 _
for (int y1 = 0; y1 < TH ; y1++)
$ i/ u+ W' R3 R* A
{
2 m% b; S8 @& V4 z% y for (int x1 = 0; x1 < TW ; x1++)
3 `9 s7 \9 {6 h) t; L+ }: o: P {
, w% ?" e0 b/ ^8 }
fseek ( fp_map, 20, SEEK_CUR);
1 f! B- w& u+ ? for (int y2 = 0; y2 < ShortWidth ; y2++)
" F, @. q* X: e; A {
+ s# f8 C% c' Z9 q& v
for (int x2 = 0; x2 < ShortWidth ; x2++)
! _! p4 l6 |0 g. C1 i6 s9 }
{
5 l9 ~% c3 T1 e1 B. U1 _
fread ( &Temdata , 2, 1, fp_map);
$ s8 l( `( K5 N* o" w Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
1 Z; B: a& b5 k8 b6 Z" \
" C A3 ~* v' P fread ( &Temdata , 1, 1, fp_map);
% s- k, o* e8 [ q" K6 ] Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
+ @- P1 X8 N$ P# {% s" q% S" s$ x' |$ Y; W) D& T. c/ p
fread ( &Temdata , 2, 1, fp_map);
. W8 D1 \3 T, L1 }$ y; ]5 L ]
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
( T8 V1 O9 P2 }' n5 d7 b: L, q9 U0 L2 f; j' z
fread ( &Temdata , 1, 1, fp_map);
! k T% \5 L$ n% i, d8 o1 n
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
6 ]' p2 A" W" x" Y8 s! [) e& h3 V
// 6
个字节* e8 U' Q# Z" W+ q7 ?# t
2 e7 J1 N, \6 R' P; z8 [2 q fread ( &Temdata , 1, 1, fp_map);
) `: [3 T) ?2 o$ _6 g Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
! _0 c. e( Y- | d8 q
# ~) l5 Y9 M7 R9 C* d$ U fread ( &Temdata , 1, 1, fp_map);
V7 m1 m! K8 p/ B8 E
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
# J% G; ~' ?! p/ f* n/ I$ b( F. w4 Q
//fseek ( fp_map,3,SEEK_CUR);
7 N) ?3 X" B% H4 M" C" g fread ( &Temdata , 1, 1, fp_map);
^9 [' q: ^. c" ?
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
4 ?6 h; T Z7 B. Q8 E. Y
: ]9 H8 M% |* X/ O
fread ( &Temdata , 2, 1, fp_map);
7 q2 f7 g( ~% I P8 A Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
. Y, Q0 E9 R5 p- S
y& {" K/ H' Z* z4 J" L2 a // 1
个字节
# U9 V2 [+ |5 I- s fread ( &Temdata , 1, 1, fp_map);
0 M5 X* Y+ W) p$ c1 I2 {4 v9 g' ? Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
7 ?3 a, R2 ~2 j5 w
//if (ftell(fp_map) > FilZize) return 0;
0 Q8 z5 J1 Y5 Y$ ]# F
}
* c: Z& x* Z1 Y- ]2 T: V }
0 W9 R! v# \# L$ q# j# g
}
4 p6 ?4 G" @1 |, a4 q" ]7 Z }
$ @9 @- V; B; G; O7 n. c" A3 w4 S0 m9 Z
fclose(fp_map);
2 u, O3 w7 Y# K" u5 Z+ h4 W
: G9 ?6 B. E( J4 W' U
2 v6 ]+ k0 }6 H2 H, [
return 1;
% Q. v5 k: a( @5 _
}