*.map 文件是记载地图信息的文件。
, V( W! N8 A$ e$ Z4 {$ M& y) t% g8 o2 t2 S2 w8 I' C# i
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
! W: E9 Z& u8 E/ b6 l+ w% d9 P+ F9 l+ U# S. M
第 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 地表一层的序号
$ y5 H6 k5 C( F
0 a$ y; U" m4 }& G( R03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号# f8 r0 v* a8 E* K
07 在地表二层 12 01 这个大序列下的子序列编号
3 E* G; e2 z7 |: h( F' @86 物件层的大序列
- O2 G4 f; d$ l9 F1 D S00 物件层的大序列下物件的子序列编号' w6 ^& W! R- ]3 }
03 03 00 目前不详0 A. W' ~8 r. p5 ~' `
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。1 x( r. y. a- t" E' w8 h# F
( W7 Q3 q9 g* j+ A( S( Z7 Z//************************************************************
/ f% E4 h0 ^) ?// 加载地图基本数据函数;
: e- ?# m. Q& r; k. _8 F//************************************************************7 |1 s6 e, z- q! H% o
8 B4 f9 Y+ V" Q, L( G//************************************************************# v, ]3 D& E- w9 d6 S7 t
// 加载地图基本数据函数;/ n0 S6 E f% L1 V
//************************************************************
. X- r; @! z$ ?: Z% i( ^6 V2 t" h+ I9 b: g/ {4 E
int Cmap: oaddata(char *filnam)( F/ w& e2 A& |8 i' @9 c* x
{
2 `( X2 x0 o" k! }/ w2 j int Temdata;
7 U+ ?3 K+ o- p; A8 b8 Q, I$ L3 Y1 z+ m: f
if(filnam == "") return 0;
$ N& r z& h+ r. ~9 [: k# G9 p, [7 {% w- s4 K3 o$ z8 ?
fp_map = fopen(filnam,"rb");; J3 j8 U0 @# j- f4 j
' o$ x& e: S: M- a if(fp_map == NULL) return 0;2 C7 ^! Y* V7 ?8 S9 p. _9 ]9 ~: c
e9 s7 H' A l. i6 O; o$ @, `
fseek ( fp_map, 16, SEEK_SET);
: @: D7 y, Z$ D: r6 F6 \ fread ( &ShortWidth, 4, 1, fp_map);/ S; a6 k5 F6 X8 K7 L/ ]
fread ( &Width, 4, 1, fp_map);6 i, _9 n5 |0 E R9 @
fread ( &Height, 4, 1, fp_map);
& n: |: Z( r8 u: \6 I/ V
& P( {! `% z& p u% R8 j int TW = Width / ShortWidth;
8 b; N+ l) Q' F3 Y6 q7 [ int TH = Height / ShortWidth;, g" h5 |- g9 e1 C9 u
3 x! |+ n) F9 \: F4 p) Q* X1 Q for (int j = 0 ; j < Width ; j++)
; W; x. Y g+ J9 o) o G {4 ~+ U- x! d, R
_DELETE_ARRAY(Cell);
4 }+ R) f9 G( A, |/ L- v( { _DELETE_ARRAY(Role);
3 ?9 A! q9 P$ d# i7 f0 i }
5 f! T9 {3 _0 J; n n+ u8 p! s
- Z$ x* [# s: n; K4 s" B- W6 \# @( D Cell = new stCell*[Width];
( p0 Q. `; ?4 {+ O1 j, k Role = new stRole*[Height];4 s1 [9 Z2 l% q
for (j = 0 ; j < Width ; j++)6 i& [/ A# B1 ]! s3 g$ ]
{5 W5 B1 x$ ~) @5 l N: x( H
Cell[j] = new stCell[Height];
9 L! d$ `8 V# z- A2 u Role[j] = new stRole[Height]; 7 ~$ E0 ?! h2 ?0 w( h# @
} , ~: N. C) T1 Q
0 ~) q" i; Y3 E; S8 }( w( l/ R" ? fseek ( fp_map, 28, SEEK_SET);9 _/ `9 x, W8 {' q2 p5 s+ n
F) Z5 I/ X" [& i/ n# k
for (int y1 = 0; y1 < TH ; y1++)! Q6 m' b7 W. y) S! s
{% s: q+ g8 I5 T- b+ X1 Q& u3 R, q
for (int x1 = 0; x1 < TW ; x1++)
6 d1 T) i& M6 O+ j; f- Y/ f/ z8 x {
" m! T( h3 y( ?2 c) C3 N, Y fseek ( fp_map, 20, SEEK_CUR);
7 h0 m2 \, s9 ^* o for (int y2 = 0; y2 < ShortWidth ; y2++)
t. N' g" Z' x; W: Z" Y {
8 i) r" d4 ?, N$ q, o for (int x2 = 0; x2 < ShortWidth ; x2++)* G! x' C& t" F$ G% d! k2 U
{$ u. X9 a5 }& f$ [' L
fread ( &Temdata , 2, 1, fp_map);/ }! v8 s- \* t" } Y4 M
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
# O1 e% }( K; {) Y/ Z/ c/ ^
0 C& X( {" F! n fread ( &Temdata , 1, 1, fp_map);
* _: O7 {$ s, @1 I' c0 r Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;+ @1 e6 l6 h# N/ n
! p6 o/ h8 x2 p& ^8 W0 q: {4 l
fread ( &Temdata , 2, 1, fp_map);
) \# X9 \4 f5 P3 h& o6 Y9 U: H Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;4 Q7 G, {* x2 D5 n! I! |0 h( O
" u( ]5 J* m8 v3 @ fread ( &Temdata , 1, 1, fp_map);4 M/ m; [0 |. n u
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
3 k* a I/ ~7 w& E- b. q // 6个字节) s& y$ \, X, R; C, W6 K. F1 i* ~
2 K) j5 p$ `9 | L/ n
fread ( &Temdata , 1, 1, fp_map);
9 D# R+ u. U& k$ s& m Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
. d: U6 Y* y) L/ _) g* Q 7 F" H. V& s2 X
fread ( &Temdata , 1, 1, fp_map);. A; u/ y1 u1 D1 M! ]' ^4 q x5 o" @
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;3 L2 }2 l+ _9 x0 f2 r7 z6 ?7 e1 q
% u" t8 O- u6 h% T: e* E //fseek ( fp_map,3,SEEK_CUR);
" a1 o0 f; i5 k2 b; e fread ( &Temdata , 1, 1, fp_map);
, M- \$ \1 z. | Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;( Y% j* l1 o: g% a' m
, L2 d, O! W5 f& t6 H; y- e4 |
fread ( &Temdata , 2, 1, fp_map);
8 t, P7 g1 v+ Q/ k" w Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
9 k) Z5 w9 F% f4 Z& E& r2 W: i2 M# P9 n. r% ?/ x5 i9 y; F
// 1个字节+ T& `: h+ D* n# q
fread ( &Temdata , 1, 1, fp_map);
3 |; Y% \6 b" X* F Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
6 e* `6 F: h/ D1 \" ?! K9 v //if (ftell(fp_map) > FilZize) return 0;
; t" D2 Y3 T7 N* r- U7 w7 W' E }0 E6 G' q. |# b
}
+ S; h. g% o! p& |2 A2 D }
9 i5 E1 E% j/ V6 _ }
) ]0 p; v% w2 g9 C0 L! I
7 F% C- P5 r# U5 w+ t. d fclose(fp_map);
" Q) {; `' a5 b: t/ z( ^: Z% z& d; E4 a+ j( F' U- o) h9 @
4 z) m& R2 _3 X+ r return 1;
" t6 d0 u) ^ ?4 S$ ]}
* {* r9 `, ?6 P t$ L* l% E |